看板 C_Sharp 關於我們 聯絡資訊
我看到手殘將我的title打錯 是delegate.BeginInvoke & Control.BeginInvoke的不同 我先跟toki大說聲對不起~~ ※ 引述《toki (いまがその時だ)》之銘言: : ※ 引述《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: 163.25.101.28