2016-06-19 34 views
3

私はC#asyncについて混乱しています。私は、並列タスク処理のために非同期を理解します。たとえば、メソッドがAとBのタスクを実行し、の非同期を使用すると、AとBは同時にアクションを実行できます。 BはAが完了するまで待つ必要はありません。ASP.NETとC#async

ただし、以下のコード例では、データベースからデータを取得するタスクは1つのみです。つまり、パラレルタスクには何もありません。しかし、それはなぜ非同期を使用していますか?

非同期を理解できるようにアドバイスをお願いします。

[ResponseType(typeof(BookDetailDTO))] 
public async Task<IHttpActionResult> GetBook(int id) 
{ 
    var book = await db.Books.Include(b => b.Author).Select(b => 
     new BookDetailDTO() 
     { 
      Id = b.Id, 
      Title = b.Title, 
      Year = b.Year, 
      Price = b.Price, 
      AuthorName = b.Author.Name, 
      Genre = b.Genre 
     }).SingleOrDefaultAsync(b => b.Id == id); 
    if (book == null) 
    { 
     return NotFound(); 
    } 

    return Ok(book); 
} 
+1

https://msdn.microsoft.com/en-us/library/mt674882.aspx – Crowcoder

+0

これは最高の記事/説明、特に「スレッド」セクションです。あなたが誤解したことを明確にしています。 –

+1

「asyncは、AとBが同じ時間にアクションを実行できるようにする」ためのレコードです。 *正しい*ではありません。ほとんどの場合、同じ*時間ではありません。より良い方法は、「非同期/待ち時間は、複雑なコードを書くことなくBの結果を待つ間に、プログラムをAにすることを容易にするsynctacticな砂糖」と考えることです。 – mayu

答えて

7

私はこれを詳細に私のasync ASP.NET articleで説明します。要約すると、asyncはスレッドを解放することで機能し、そのスレッドは他のものに使用できます。

は、パラレルタスクには何もないことを意味します。しかし、なぜそれは非同期を使用していますか?

この要求は、複数のことを同時に実行しないことは事実です。それを非同期にしても要求はまったく高速化されません。

しかし、全体としてのアプリケーションには他に行うことがあります。具体的には、それが応答できる他の要求があります。 asyncを使用すると、スレッドプールスレッドがアクティブに使用されていないときはいつでも解放されます。これにより、アプリケーションのスケーリングが可能になります(バックエンドがスケーラブルであることが前提です)。つまり、asyncを使用すると、スレッドプールを最大限に活用できます。

0

データベースに接続し、応答を得ることがいくつかの時間がかかる可能性があり、それが同期的に行われた場合、アプリケーションが待機状態にあるすべてのその時間をロックされることになるので、それはaysncを使用しています。

呼び出しを非同期にすると、要求がデータベースに送信され、データが返されている間、アプリケーションは何か他のことを自由に行うことができます。

-2

関数をasyncとマークし、プログラム内の別の場所でawaitキーワードを使用して呼び出すと、asyncメソッドを呼び出したスレッドはプログラムの実行をブロックせず、あなたの答えを受け取る。

つまり、データベースからデータを引き出している間は、UI全体がフリーズしません。

+4

この回答は、これはクライアントアプリケーションでした。しかし、ASP.NETの場合、この答えは間違っています。 'async'はHTTPレスポンスを送信しません。 –

+2

また、スレッドは中断されません。 – Crowcoder

+1

@StephenClearyああ、そうです。私はASP.NET-tagを見逃してしまった。そうですね、私の答えは本当にうまくいきません... – Luca