※ 引述《reptile0426 ( )》之銘言:
: 我上網看了一下
: 發現他們不同的地方"好像是" 喚起的thread不同
就我所知,Control.Invoke 和 Control.BeginInvoke 做的事都一樣
都是將 delegate 排進 UI Thread 呼叫
但是不同之處
Invoke - 會等到 Invoke 的 delegate function return (Sync)
BeginInvoke - 射後不理 (Async)
(其實不能完全說不理,他有回傳 IAsyncResult 物件給你等結果
說非同步執行比較正確)
: 但是我又對worker thread這個東西有點疑問
: 它不是UI thread,那他是什麼東西
: 一個windows form程式除了本身的main thread之外,背後還有一個worker thread
: 然後又冒出一個threadpool,這更讓我想瞭解c#觀念 越來越模糊
: 想請問一下各位前輩,可以指導小弟觀念上的問題
: 謝謝各位
Form 在運作的時候,本身有一個 UI Thread 負責更新 UI 及收 Windows Message
但是目前 .NET 所有的 Control 物件都非 Thread-safe object
所以由別的 Thread 來的呼叫都必需透過 Invoke delegate 的方式,來轉換成在
UI Thread 執行
要舉例的話,就是你開了一個背景 thread ,裡面跑了一個 socket server
你希望有 client 連上的時候更新 label1.Text,所以你把 server 的 OnConnect
連結到 Form 上的某個 function
void OnClientConnect(string clientName)
{
label1.Text = clientName;
}
但是紅色這行會出現 exception,因為這個 function 是由背景 thread 的 server 呼叫的
Form為了逼免跨 thread 存取的問題,會 throw exception 攔下來
正確寫法會是
delegate void CommonTextFuncDlg(string value);
void OnClientConnect(string clientName)
{
if (InvokeRequired)
{
Invoke(new CommonTextFuncDlg(OnClientConnect), clientName);
return;
}
label1.Text = clientName;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.108.91
※ 編輯: toki 來自: 220.135.108.91 (11/21 17:35)
※ 編輯: toki 來自: 220.135.108.91 (11/21 17:37)