これらの2つの記事、SynchronisationContextおよびAsync/Awaitを読んでください。私はASP.NET SynchronisationContextが非同期メソッドの実行をリクエストスレッドに再入力する方法をよく知っています。ASP.NETで既定のThreadPool SynchronisationContextを使用する
再入国の大きな問題の一つは、あなたが.Wait()
を使用するか、または.Result
場合は、デッドロックを引き起こす可能性があることである、なぜ:のawaitが完了すると
、それは非同期メソッドの残りの部分を実行しようとしキャプチャされたコンテキスト内でしかし、そのコンテキストには既にスレッドがあり、非同期メソッドが完了するのを(同期的に)待機しています。
あなたは理由SynchronisationContextとTask.Factory.StartNew
を使用し、それをASP.NETアプリケーション内ThreadPool
SynchronisationContext
を割り当てる場合の影響がどうなるか、それはpermits only one chunk of code to run at a time.
方法で使用されているシングルスレッドのこれを取得?
私はあなたがこれをやる理由に悩まされません。何が起こるのでしょうか?
非同期操作が完了する前にスレッドがクリアされる可能性があるため、ASP.NETで非同期操作をFire-and-Forgetすることは決してありません。 ThreadPool
SynchronisationContext
の場合も同様です。
したがって、残りの作業を実行する同期コンテキストがまだ一度に1つずつ実行されているので、 'Task.Run'で' .Result'と '.Wait()'を呼び出す効果は同じですそれはASP.NETのコンテキストであるので –
私は 'Task.Run'はキャプチャされたコンテキストを使用すると思ったが、私は[ソースコード]から見ることができる(http://referencesource.microsoft.com/#mscorlib/system /threading/Tasks/Tasks/Task.cs,89fc01f3bb88eed9)[ThreadPoolTaskScheduler](http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/TaskScheduler.cs,495c69a13f3b023f) –
@CallumLinington:あなたがブロックした場合タスクが 'Task.Run'から返された場合、リクエストコンテキスト内のスレッドをブロックします。その作業は1つではなく2つのスレッドを使用しています。 –