閱讀這兩篇文章,SynchronisationContext和Async/Await。我非常熟悉ASP.NET SynchronisationContext處理將異步方法執行重新輸入請求線程的方式。在ASP.NET中使用默認的ThreadPool SynchronisationContext
一個與再入大問題是,如果你使用.Wait()
或.Result
可以導致死鎖,原因是:
當的await完成後,它會嘗試執行異步方法的其餘部分在捕獲的上下文中。但是該上下文已經有一個線程,它正在(同步)等待異步方法完成。
你得到,因爲正在使用由SynchronisationContext和方式單一線程的這一點,permits only one chunk of code to run at a time.
什麼是使用Task.Factory.StartNew
和分配給它的ASP.NET應用程序中的ThreadPool
SynchronisationContext
的影響?
我不會爲什麼要這麼做而煩惱,而更多會發生什麼?
我知道你不應該在ASP.NET中使用Fire-and-Forget異步操作,因爲在異步操作完成之前可能會清除線程。在ThreadPool
SynchronisationContext
的情況下,情況也是如此。
那麼,調用'Task.Run'上的'.Result'和'.Wait()'效果仍然是一樣的,因爲執行其餘工作的同步上下文仍然一次執行一個因爲它是ASP.NET上下文 –
我認爲'Task.Run'會使用捕獲的上下文,但是我可以從[源代碼](http://referencesource.microsoft.com/#mscorlib/system /thread/Tasks/Task.cs,89fc01f3bb88eed9)這是[ThreadPoolTaskScheduler](http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/TaskScheduler.cs,495c69a13f3b023f) –
@CallumLinington:如果您阻止從'Task.Run'返回的任務,那麼你會在請求上下文中阻塞一個線程。而且,當這項工作正在進行而不是一項工作時,您將使用兩個線程。 –