這個問題事實上涉及了線程間的通訊問題,對了,這就需要delegate這個東西了。儘管可以通過某種方法可以在線程內部調用WinForm主窗體的控件,但這不是安全的做法,在.NET2.0之後會提示“線程間操作無效”,而常規的做法是使用delegate的類型,通過異步機制調用主窗體的控件。
之前爲了這個在網上搜索了不少的文章,因爲個人經驗不足,在Invoke跟delegate兩個東西的解釋上我就用了不少的時間,雖然仍然還沒弄明白,方法還是找到正解,捨去許多細枝末節(關於C#的代理詳見度娘),簡單的使用例程如下所示:
//使用一個WinForm的應用程序 public partial class Form1 : Form { //聲明代理 private delegate void UiProcessFunction(object param); // //主窗體 public Form1() { InitializeComponent(); //開啓主線程 Thread thread = new Thread(this.LoopThread); //後臺線程,不加此聲明的話會導致程序關閉錯誤 thread.Is true; //開啓主線程 thread.Start(); } // //線程函數 public void LoopThread() { int i = 0; while (true) { string arg = "Count : " + i.ToString(); //注意此處的參數傳遞的方法 this.Invoke(new UiProcessFunction(UpdateLabel), new object[] { arg }); this.label1.Text = "Count : " + i.ToString(); Thread.Sleep(500); i++; } } // //更新標籤的內容 public void UpdateLabel(object param) { this.label1.Text = (string)param; } }
因爲C#下Timer要拖控件,有時還是用Thread比較方便一點。以上代碼的運行環境是.NET4.5。