14

.net 4.5 での async と await についてはまだよくわかりません。これまでのところ、私はそれが待っていることを理解していると思います:

  1. 関数を(その右側に)別のスレッドに配置します。
  2. 実行を現在の関数の呼び出し元に戻します
  3. ただし、待機中の(非同期)関数が終了するまで、現在の関数の残りのコード「人質」を保持します。

私が何か誤解している場合は、私を修正してください。したがって、上記が当てはまる場合、非同期が必要な ApiController の Post 関数に行き詰まっています。

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
{        
     myDataContext.MyObjects.InsertOnSubmit(obj);
     myDataContext.SubmitChanges();

     await SomeReallyLongRunningTaskAsync();        

     // obj would now have the new Id, which I'm really after.
     return Request.CreateResponse(HttpStatusCode.Created, obj);

}

したがって、これを正しく理解している場合、Post は実行を終了し、呼び出した人に制御を返しmyApiController.Post(obj)ます。しかし、「人質」をHttpResponseMessage待っているので、まだオブジェクトを持っていません。return Request.CreateResponse(HttpStatusCode.Created, obj);

上記の単純な例では、呼び出しはすぐにクライアント (つまり、クライアント JS Web サイトまたはモバイル アプリ) に返されますか? もしそうなら、それは201、400、500(しないほうがいい)、その他ですか?

4

2 に答える 2

15

puts the function (to its right) on a separate thread.

No. async does not start a new thread. I have an async intro that you may find helpful.

Post will finish execution and return control to whoever called myApiController.Post(obj). But I don't have the HttpResponseMessage object yet

Correct.

In this above simple example, would the call immediately return to the client (that is, client JS website or mobile app)?

No. ASP.NET MVC 4.5 sees that you're returning Task<HttpResponseMessage> and not HttpResponseMessage, so it will not send the response until your Task is completed (at the end of your async Post method).

于 2013-10-10T22:00:30.040 に答える