2012-10-30 57 views
1

我想在另一個線程中運行自己的類,但是如果我這樣做,則無法使用我的例如EventHandler內的標籤,我該如何避免這種情況?在單獨的線程上運行自己的類

這是我的代碼的外觀:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Ts3_Movearound 
{ 
    public partial class Form1 : Form 
    { 
     TS3_Connector conn = new TS3_Connector(); 
     Thread workerThread = null; 
     public Form1() 
     { 
      InitializeComponent(); 
      conn.runningHandle += new EventHandler(started); 
      conn.stoppedHandle += new EventHandler(stopped); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //System.Threading.Thread connw = new System.Threading.Thread(conn); 
      workerThread = new Thread(conn.Main); 
      workerThread.Start(); 
     } 

     public void started(Object sender, EventArgs e) 
     { 
      label1.Text = "Status: Running!"; 
     } 
     public void stopped(Object sender, EventArgs e) 
     { 
      label1.Text = "Status: Stopped!"; 
     } 
    } 
} 

這就是錯誤:

InvalidOperationExpetion in Line "label1.Text = "Status: Running!";"

回答

5

只能通過更新UI線程的控制。使用label1.Invoke()來做到這一點:

label1.Invoke((MethodInvoker)delegate { 
    label1.Text = "Status: Running!";" 
}); 
1

我想看看使用這個BackgroundWorker。然後,您使用以下內容:

1)在調用RunWorkerAsync之前,將標籤設置爲運行,因爲沒有線程問題。 2)調用的RunWorkerAsync如果你設置任何控制使用後:

  label1.Invoke(new Action(() => label1.Text = @"Status: Running!")); 

3)一旦這個過程完成,那麼你可以設置標籤,通過分配給RunWorkerCompleted事件的方法來停止。由於它在主線程上運行,因此此方法中不應存在線程問題。

相關問題