2016-09-19 16 views
1

私はまだ方法と時間をasp.netでasyncメソッドを使用する方法について私の頭を上げようとしていますが、私はそれについてダースの質問をすることができましたが、この動作は私にとって驚くべきことです...私がasyncメソッドを作成したが、それをvoidとして宣言してから、それを待たずに、ワーカースレッド上でその非同期コードを実行しただけで、結果を得ることができます。すなわち、voidは呼び出し元に直ちに返され、呼び出し側はその処理を行い、可能であればasyncメソッドの前に完了します。しかし、私の.netコアアプリケーションでは、そうは間違いありません。私はasync void私は別の非同期メソッド内から呼び出すと私はawaitasyncコードのスレッドブロックはありませんがありますがあります。ここで何が起こっていますか?ASPNETコアと非同期実行

ありがとうございました。

+0

また、私はまだそれを再生しています - そして、私はバックグラウンドで実行する 'タスク'を得ることができませんか? – user2403744

答えて

7

私はまだときは、それらを使用したいかとasp.net

で非同期メソッドを使用する

まわりで私の頭を取得しようとしている:あなたは、非同期の仕事を持っている

  1. する。一般的に言えば、これはCPUバインドではなくI/Oバウンドを意味します。
  2. バックエンドの縮尺。たとえば、WebAPI、NoSQLサービス、SQL Serverクラスタなどです。バックエンドが単一のSQL Serverインスタンスであれば、スケーラビリティがなく、Web層で非同期を使用する必要はありません。
  3. あなただけのワーカースレッド

    async voidにその非同期コードを実行したかのように、それは本質的だ

はちょうどそれが完全なとき検出から発信者を防ぐことができます。 async Taskメソッドと同じように、呼び出し元と同じコンテキストで実行されます。

非同期コード

上のスレッドブロックそれはあなたの「非同期」のコードが実際に同期している可能性があります。 awaitがない場合、コンパイラは同期していることを警告します。


あなたは私のintro to asyncブログの記事とasync on ASP.NET MSDNの記事役立つを見つけることができます。 asyncまで、ASP.NET Coreは、1)ASP.NETリクエストコンテキストがなくなりました.2)パイプライン全体が非同期互換であるため、非同期フィルタや非同期ビューコンポーネントが機能します。

+0

大丈夫です。私は何が私を捨てていると思う私は早く読んで、 "待っている"スレッドでは何もしていないが、私はそうではありません:あなたは明らかに別のスレッドにいくつかの時点で作業を移しているawaitableが実行されている間、現在のスレッドがもうブロックしていないと言っている場合。つまり、待ち時間があるスレッドで実行されていて、呼び出されたスレッドではありません。だから、いくつかのスレッドは、他のスレッドよりも貴重だと思います。これのポイントとして、本当に? – user2403744

+0

@ user2403744:いいえ。本当に非同期のコードでは、[スレッドはありません](http://blog.stephencleary.com/2013/11/there-is-no-thread.html)。 –

+0

grrr、ok。私は今晩、ウサギの穴を掘り下げて、私がすでに知っていることを真実であると確信しています:あなたは正しいです。それは私の脳を傷つけるようになるだろう、私はそれを知っている。 – user2403744