簡體   English   中英

WebClient在哪個線程上引發事件?

[英]On which thread(s) does WebClient raise its events?

我找不到任何指定WebClient在哪個線程上引發事件的文檔。 我進行了一些測試,並確定了以下內容:

  • 如果從UI線程(例如從事件處理程序)調用,則事件處理程序將在該線程上執行。 作為測試,我在調用OpenReadAsync之后添加了一個無限循環。 從未調用過事件處理程序。

  • 如果沒有UI線程(例如在控制台應用程序中),則事件處理程序將在線程池線程上執行。 在這種情況下,如果我想在應用程序的其余部分提供一些結果,則必須注意線程問題。

此行為記錄在任何地方嗎? 我什么都沒找到。

關於C#的新異步功能,我有基本相同的問題-最終,必須執行異步代碼。 當沒有UI線程時,是否還會生成線程池線程? 進而需要線程安全代碼嗎?

我覺得我在這里錯過了一些東西-我只能找到很少的信息,但這對我來說似乎很重要。

對於WebClient ,我也沒有找到任何文檔,但是看到的行為與您相同。 本質上,這可以描述為“如果調用開始時有活動的同步上下文,則使用它-否則使用線程池。”

對於C#5中的異步行為,它取決於您正在等待的內容的實現...但是我相信Task<T>等待者將使用TaskScheduler.Current來安排繼續時間-這意味着您將看到相同的內容某種行為。 (不一定設置任務計划程序的UI線程,但這是最明顯的示例。)

使用線程池線程時,它仍應是線程安全的-該方法一次僅在單個線程中執行,我相信任務並行庫會執行所有必需的內存屏障。

如果您對異步如何在后台掛在一起感興趣,您可能需要閱讀我的Eduasync博客系列

WebClient類實現基於事件的異步模式 該模式已在《框架設計指南》中進行了充分描述,但MSDN還提供了一些如何實現的提示:

該模式的實現者使用AsyncOperationManager創建AsyncOperation使用每個異步操作並引發事件AsyncOperation.Post方法 POST方法執行的傳遞回調的SynchronizationContext ,這是當前在當時的時候AsyncOperation創建。

WinForms或WPF應用程序中的默認SynchronizationContext是UI線程,在控制台應用程序中為null WebClient類顯然選擇在后一種情況下在ThreadPool線程中引發事件,但這是實現細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM