2011-07-20 44 views
0

我試圖優化我的代碼,以便從UI調用commandline調用或從UI調用它。C#如何從外部代碼更新表單控件

問題是,我已經寫了我們在Form-class裏面寫的worker-code。 現在我想把這個工人代碼放到一個單獨的類中。

讓我們做一個小樣本,使我的需求更加清晰:

public partial class form1 :Form 
{ 
    void AddLogmessage(String msg) 
    { 
    // update an listview 
    ListViewItem item = new ListViewItem(); 
    item.Text = msg; 

    // Add the item to the ListView 
    LogView.Items.Add(item); 
    } 

// button on ui to start working 
private void btnStartTestRun_Click(object sender, EventArgs e) 
{ 
    try 
    { 
    DoSomeWork(); 
    } 
    catch(Exception ex) 
    {} 
} 

private void DoSomeWork() 
{ 
    // do some really generic hard work.... 
    AddLogMessage("working"); 

    // do some more generic long lasting hard work.... 

    AddLogMessage("working goes on..."); 

// in case of an error throw Exception 

} 

現在我想refcator工人代碼添加到窗體類以外的地方工作,但能所發生的事情報告給UI(

public void AutomaticTaskHandler() 
{ 
    string[] cmdline = Environment.GetCommandLineArgs(); 
    Arguments args = new Arguments(cmdline); 

    if (args["automatic"] != null) 
    { 
     doSomeWork(); 
    } 
} 
:如果有的話),或致電workercode沒有UI和做其他reportings到不同的目標(與報告結果到服務器上的其他庫)

事情是這樣的溝通

在這種情況下,我不必向用戶界面報告消息,而是向服務器發送一些其他消息(不是相同的消息!!)。

所以我的問題是如何使這個最好的方法不必編寫doSomeWork代碼兩次,但只能發送當前場景中的消息是需要的?

我想過DelegatesEvents,但我不太熟悉這個工作。

任何幫助將不勝感激。

感謝Meister_Schnitzel

回答

0

基本上,你會創建一個接口IMessageTarget與方法SendMessage。你的用戶界面代碼將創建一個接口的實現,該接口將消息輸出到用戶界面,並且你的控制檯代碼將創建一個將該消息發送到服務器的接口的實現。在調用doWork方法時,您將提供IMessageTarget的實例。