2017-03-19 7 views
0

コントローラから呼び出されたときにPostAsyncコールのシナリオが必要ないシナリオで何が起こっているのかを知りたいのですが、
は例えば、私はいくつかのアクションHttpClient PostAsync from controller from result

[HttpPost] 
public ActionResult DoSomething(SomeModel model) 
{ 
    ... 
    PostDataFireAndForget(model); 
    ... 
    return new EmptyResult(); 
} 

private void PostDataFireAndForget(SomeModel model) 
{ 
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      string targetUrl="SomeUrl"; 
      client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content)); 
     } 
    } 

    catch (Exception ex) 
    { 
     //we didn't care about the response, no additional requirements here 
     //ignore 
    } 
} 

を持っているので、私はそれがすべての可能なシナリオに進むと、なぜだろうかを正確に知っているように思います。最も興味深いのは、PostAsyncが他のすべてのアクションコードよりも時間がかかり、PostAsyncが完了する前にアクションが完了するというシナリオです。終了/ブロック/終了しますか?実際に何らかの非同期のものを実行したいので、結果を待たずにいたい場合は、より良いアプローチがありますか?

+0

例外をキャッチして無視できるように、fireとforgetメソッドを非同期にします。現在の設計では、主なアクション要求のスレッドが転倒する可能性があります。非同期にすることで、このメソッドは例外を処理(またはこの場合は処理しない)し、他のスレッドを続行させることができます。 – Nkosi

+1

ASP.NETの落とし穴(と落とし穴)はここで何度も議論されており、 'QueueBackgroundWorkItem'を検索しています。 – Noseratio

答えて

1

例外をキャッチして無視できるように、fire and forgetメソッドの非同期をすべての方法で行います。現在の設計では、主なアクション要求のスレッドが転倒する可能性があります。方法非同期(async)それを作ることで

private async Task PostDataFireAndForgetAsync(SomeModel model) 
    try { 
     using (var client = new HttpClient()) { 
      var targetUrl="SomeUrl"; 
      await client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content)); 
     } 
    } catch (Exception ex) { 
     //we didn't care about the response, no additional requirements here 
     //ignore 
    } 
} 

は(このケースで処理するかではない)を処理することができ、例外や他のスレッドを継続させます。あなたが結果を必要とするかどう

[HttpPost] 
public ActionResult DoSomething(SomeModel model) { 
    //... fire and forget 
    PostDataFireAndForgetAsync(model); 
    //... 
    return new EmptyResult(); 
} 
+0

この場合、 'DoSomething'が' PostDataFireAndForgetAsync'の前に完了すればどうなりますか? – HardLuck

+0

ASP.NET同期コンテキストの追跡タスクが開始されておらず、すべてのタスクが完了するのを待っていますか? –

0

関数/メソッドは常に無関係な、入力を処理し、出力を提示するために呼び出されます。結果を待つ必要がない場合は、結果を無視したい場合でも、プロセスが完了するのを少なくとも待つ必要があります。

シナリオでは、すべてのUIプロセスが完了して終了する可能性がありますが、非同期が完了するまで、アプリケーションはメモリ内にとどまりますが、結果を出すことなく要求を出しています。すべてのルーチンを完全に終了する前に、非同期処理が完了するのを待つことが好ましい。