看板 C_Sharp 關於我們 聯絡資訊
※ 引述《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)