這個問題事實上涉及了線程間的通訊問題,對了,這就需要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。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。