如何跨執行緒訪問Winform中的UI元素
阿新 • • 發佈:2022-03-05
如何跨執行緒訪問Winform中的UI元素
假如製作一個Socket聊天應用程式,很可能會用到多執行緒;
例如為Receive方法開闢單獨一個執行緒,例如為Receive方法開闢單獨一個執行緒(後臺執行的執行緒IsBackGround=true);
然而Winform的UI控制元件都是執行在主執行緒中的,如果從其他執行緒直接訪問UI控制元件,系統就會報錯;
public void Show(string s)
{
listBox1.Items.Add(s);
}
那麼如何才能在其他執行緒訪問主執行緒,並且向UI控制元件傳遞資料呢?
有兩種方法可以選擇:
一、用BeginInvoke
public void ShowMessage(string message)
{
BeginInvoke(new Action<string>((msg) => listBox1.Items.Add(msg)), new object[] { message });
}
二、用委託
//宣告委託 public delegate void ShowMsg(string s); //委託要繫結的方法 public void Show(string s) { listBox1.Items.Add(s); } //在多執行緒中呼叫的方法,不會報錯的方法 public void ShowMessage(string message) { //例項化委託,並繫結方法 ShowMsg OnShowMsg = new ShowMsg(Show); //如果是跨執行緒的執行if程式碼塊 if (this.InvokeRequired) { this.Invoke(OnShowMsg, message); } //如果不是跨執行緒的,執行else程式碼塊 else { Show(message); } }