任何人都可以解釋代理和BackgroundWorker之間的區別嗎?在這種情況下,Backgroundworker比Delegate更有效率?因爲我們有異步委託,所以需要使用BackGroungWorker。代表與BackgroundWorker的差異?
0
A
回答
9
BackgroundWorker的類允許您在一個單獨的,專門的線程運行的操作。
代表是一種類型,它定義一個方法簽名。 ...委託用於將方法作爲參數傳遞給其他方法。
的使用哪一個的問題無關與效率。
BackgroundWorker
是一個簡化線程工作的包裝,您也可以使用異步委託,但正確管理它們要困難得多。或者,從MSDN:
當你想要一個負責任的UI,你都面臨着這樣的操作有關,BackgroundWorker的類提供了一個方便的解決方案長的延遲。
2
的後臺工作主要是爲了你需要輕鬆地運行在後臺線程任務,並在屏幕上提供進度更新UI的工作。
一個優點是它執法官其回調爲你的UI線程,所以你並不需要檢查InvokeRequired等
委託是傳遞函數作爲參數更通用的機制,並通過執行他們自己異步給你一個在另一個線程上運行這些方法的簡單方法。
1
後臺工作人員是一個抽象幫助您在單獨的線程上執行操作。
代表並不真正開始單獨的線程 - 它們是引用方法的類型。
但是你可能感興趣的是當你應該使用異步方法,而不是使用後臺工作。我在這方面沒有太多經驗,但是Anders Hejlsberg talked about it some in his PDC session on the Future of C#。
我得到的消息是,在某些情況下,由於較低的複雜性,異步方法會更可取。 UI線程仍然會被阻塞,但不會長時間地影響它。
3
我有一個BackgroundWorker
,異步委託和其他方法on my blog(從做後臺操作的角度)的簡要比較。
BackgroundWorker
具有以下優點:
- 進展報告很容易。任何
BackgroundWorker
其WorkerSupportsProgress
財產是真實的可能會報告進度。DoWork
代表可能會調用ReportProgress
,這會導致ProgressChanged
事件觸發。 - 有一個內置的協作取消系統。取消線程首先調用
BackgroundWorker.CancelAsync
。這會導致BackgroundWorker.CancellationPending
屬性變爲true。代表應該監視該屬性(定期檢查),並將DoWorkEventArgs.Cancel
設置爲true,並在操作被取消時返回。代表RunWorkerCompleted
通過檢查RunWorkerCompletedEventArgs.Cancelled
來檢測到取消結果。 - 同步是自動完成指示和進度報告。
ProgressChanged
和RunWorkerCompleted
事件與RunWorkerAsync
被調用時的SynchronizationContext
同步。
異步委託具有這樣的優勢:
- 返回的值是簡單的;它只是返回。
總之,我推薦使用Task<TResult>
而不是BackgroundWorker
或異步委託。
相關問題
- 1. 誤差與BackgroundWorker的
- 2. 報表與表單之間的差異
- 3. Windows與Linux的差異 - 差異
- 4. 與BackgroundWorker異步更新狀態的替代方法
- 5. pandas read_table與read_csv的性能差異與from_csv與read_excel的差異?
- 6. 2個相同的ListView與代表內部的小差異
- 7. Co(ntra)代表參數的差異
- 8. 代表Ruby中的時間差異
- 9. 差異與XXD
- 10. 差異與WEC7
- 11. 差異與flattrs_user_count
- 12. 差異與PROMT
- 13. 差異與[XmlInclude]
- 14. 差異與JavaScript
- 15. SQL與差異
- 16. 差異與attr_accessible
- 17. 差異與imsave
- 18. 與接口方法中代表的差異無效
- 19. BackgroundWorker怪異
- 20. Java源代碼與Android SDK差異?
- 21. 在backgroundworker中運行異步代碼
- 22. gprolog與重複的差異列表
- 23. 與MemberInit表達式的性能差異
- 24. jQuery代碼差異
- 25. 與BackgroundWorker的
- 26. 與BackgroundWorker的
- 27. ObjectContext.SaveChanges與BackgroundWorker的
- 28. 差異表
- 29. 代碼中的CodingBat差異
- 30. 的Perl:差異代碼
BackgroundWorker使用線程池,它不創建它自己的線程。 – Paolo 2010-12-22 19:41:00