2017-09-20 7 views
0

最近、私たちが使用しているコードで、うまくいきます。OwinCommunicationListenerでホストされているAsync Web APIのFireメソッドとForgetメソッド

OwinCommunicationListenerでホストされているサービスファブリッククラスタでホストされているWeb APIがあります。

[HttpPost] 
public async Task<HttpResponseMessage> WebApiMethod(RequestObject request) 
{ 
    string test; 
    SomeObject obj; 
    .... 
    DoSomethingAsync(test, obj); 
    return this.ActionContext.CreateResponse(HttpStatusCode.OK, new { Status = "Success" }); 
} 


private async Task DoSomethingAsync(string param1, SomeObject param2) 
{ 
    ..... 
    await SomeOtherAsyncMethod(); 
    ..... 
} 

は、私の知る限り理解し、それはDoSomethingAsyncの方法の完了とオフ処分以降早期に完了した場合TaskCancelledExceptionか何かをスローする必要があり、要求間の競合状態にする必要がありますが、それはありませんことはありません。

DoSomethingというタスクが待たれていないにもかかわらず、毎回その作業が完了しているので、何らかのエラーが予想されます。私は

await Task.Delay(10000); 

を追加する場合は、APIの応答ほぼ瞬時に、コードの10秒の残りが実行された後。その時間までに、元の呼び出しがFire-and-Forget(待機していない)だったので、ホストスレッドを廃棄するべきではありません。

私はここで何が欠けていますか?

+0

これは私には不明です。なぜどこから例外が出ると思いますか? – Fildor

+1

ASP.Netのメソッドを呼び出すことは、ほとんど常にひどい考えです。あなたは、この種のものを扱うために構築されたライブラリ、例えばHangfireを使うべきです。 Azureにいるようだから、その機能を100%利用しているわけではなく、WebJobsかもしれませんか? – DavidG

+0

@fildor私はメソッドDoSomethingAsyncを待っているわけではないので、例外を待っていますが、それでも何とか毎回その作業を完了します。 – goldsmit409

答えて

0

DoSomethingAsyncでリクエストオブジェクトを結び付けることは何もありません。しかし、あなたがRequestObjリファレンスをDoSomethingAsyncに渡しても、オブジェクトを参照している間にGCがあなたのRequestObjを収集しないので、メソッドは問題なく完了します。また、一度非同期実行が始まると、それは自分の人生の中で生き続けます。つまり、別のスレッドでコールバックが完了するかもしれないが、要求処理パイプラインがディスパッチされたことです。

関連する問題