伊莉討論區

標題: 關於 c#.net 中的thread Invoke 問題 [打印本頁]

作者: 滄浪水    時間: 2011-8-29 10:13 AM     標題: 關於 c#.net 中的thread Invoke 問題

最近在寫 tcp 程式時, 在網路上找到一些多緒方法

1.
  1.    
  2. Thread NewThread = new Thread(new ThreadStart(NewThreadMethod));   //建立測試用的執行緒
  3.             NewThread.Start();  //啟動測試用的執行緒
複製代碼


2.
  1. MethodInvoker mi =
  2. new MethodInvoker(RunsOnWorkerThread);


  3. mi.BeginInvoke(null, null);
複製代碼



請問這兩個方法有什麼不一樣,
目前的理解, 從msdn上來看
Invoke 是具執行緒安全可以直接更新 form
比較常看到的
Thread 中用
Invoke 去更新 windows form 的資料
這樣的話直接用 BeginInvoke 去建立非同步委派不是比較直接??

所以想請教一下這兩個方法, 本質上及應用的條件和場合有什麼不一樣??
作者: Aeroth    時間: 2011-8-30 10:22 PM

1. Delegate.Invoke - 同步呼叫,原執行緒會等待被Invoke的工作執行完畢再繼續自己的工作
2. Delegate.BeginInvoke - 非同步呼叫,原執行緒會繼續往下執行自己原本的工作,系統從ThreadPool取得另一個thread instance來執行被Invoke的工作
3. Control.Invoke - 使用UI thread來執行被Invoke的工作,原執行緒會等到執行完畢再繼續自己的工作
4. Control.BeginInvoke - 使用UI thread來執行被Invoke的工作,原執行緒會繼續往下執行自己原本的工作

一般來說我們在寫一個程式的時候,為了讓UI的即時回應不會有Hang住 (Not Responding)情形,我們通常會為需要比較多時間、比較複雜運算的工作、需等待其他程式回覆(DB connection)…建立新的執行緒來處理,等到這個執行緒的內容做完再更新畫面,或在過程中顯示進度讓使用者知道。但這會牽扯到跨執行緒存取UI thread建立的controls的問題:
System.InvalidOperationException – Cross-thread operation not valid: Control ‘xxxxx’ accessed from a thread other than the thread it was created on.
所以在更新UI controls時便會透過3或4來呼叫UI thread來執更新的動作,一般都會用4的方法,因為原執行緒就可以繼續他的工作而不用等待UI thread執行結束。BackgroundWorker也因此而誕生(http://msdn.microsoft.com/en-us/ ... ckgroundworker.aspx)。
細節你可以Google一下或上MSDN查閱
作者: hootcaption    時間: 2011-12-13 10:49 AM

樓上大大講的很清楚 最近也在開發多執行緒的視窗專案  UI上面的thread處理很重要 因此看了一些關於delegate與invoke的處理




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!