2013-02-28 66 views
0

我有一個設置並顯示文本框的窗體。的形式負載的方法,我從一個完全獨立的類名Processing開始一個新的線程:從另一個類和線程C追加到文本框#

private void Form1_Load(object sender, EventArgs e) 
    { 
     Processing p = new Processing(); 
     Thread processingThread = new Thread(p.run); 
     processingThread.Start(); 
    } 

這裏是處理類。我想這樣做的是創造Utilities類中的方法,讓我更新來自任何類,我需要的文本框:

public class Processing 
{   
    public void run() 
    {    
     Utilities u = new Utilities(); 

     for (int i = 0; i < 10; i++) 
     { 
      u.updateTextBox("i"); 
     }      
    } 

} 

然後最後Utilites類:

class Utilities 
{ 
    public void updateTextBox(String text) 
    { 
     //Load up the form that is running to update the text box 
     //Example: 
     //Form1.textbox.appendTo("text"): 
    } 
} 

我已閱讀Invoke方法,SynchronizationContext,後臺線程和其他所有內容,但幾乎所有示例都使用與Form線程相同的類中的方法,而不是單獨的類。

+2

使用單獨的線程更改界面時要小心;最後可能會有幾個例外。他們通常建議更改接口以不離開當前的線程。 – Greg 2013-02-28 19:50:16

+0

什麼UI技術,WPF,WinForms?在WPF中,Dispatcher使得這種操作變得非常簡單...... – 2013-02-28 19:51:58

+0

你沒有指定你使用的.NET框架的版本,但是如果你使用的是.NET 4.5,可以考慮使用'async' /'await'來保持你的UI響應而不是線程。 – 2013-02-28 19:56:45

回答

2

我會一個AppendText()方法添加到您的Form1類,像這樣

class Utilities 
{ 
    Form form1; // I assume you set this somewhere 

    public void UpdateTextBox(String text) 
    { 
     form1.AppendText(text); 
    } 
} 

有一個很好的全面審查.NET中的線程可以在這裏找到:Multi-Threading in .NET。它有一個關於Threading in WinForms的部分,可以幫助你很多。

+0

我最終做了如何查理建議這樣做,儘管看起來進展函數可能是最好的方法。當我有更多的時間時,我會更多地玩這個遊戲。謝謝大家的回答! – user2121001 2013-03-01 13:28:10

3

Progress類是專門爲此設計的。

在您的形式,啓動後臺線程之前,創建一個Progress對象:

Progress<string> progress = new Progress<string>(text => textbox.Text += text); 

然後提供progress對象添加到您的輔助方法:

Processing p = new Processing(); 
Thread processingThread = new Thread(() => p.run(progress)); 
processingThread.Start(); 

則處理器可以報告進度:

public class Processing 
{   
    public void run(IProgress<string> progress) 
    {    
     for (int i = 0; i < 10; i++) 
     { 
      Thread.Sleep(1000);//placeholder for real work 
      progress.Report("i"); 
     }      
    } 
} 

The在內部,類將捕獲它在第一次創建時的同步上下文,並調用所有事件處理程序作爲對該上下文的Report調用的結果,這只是一種說法,它將轉移到UI線程上代表你。它還可以確保您的所有UI代碼都保留在Form的定義中,並且所有非UI代碼都在表單之外,幫助將業務代碼與UI代碼分開(這是一件非常好的事情)。從您的公用事業類

public void AppendText(String text) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new Action<string>(AppendText), new object[] { text }); 
     return; 
    } 
    this.Textbox.Text += text; 
} 

然後,調用它像這樣:

相關問題