5

私はMVC4 ApiControllerを使用してAzure Blobにデータをアップロードしています。ここにサンプルコードがあります:MVC 4 async ApiControllerのTask.Factory.StartNewを使用しますか?

public Task PostAsync(int id) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     // CloudBlob.UploadFromStream(stream); 
    }); 
} 

このコードは意味がありますか?私はASP.NETがすでにワーカースレッドでリクエストを処理していると思うので、別のスレッドでUploadFromStreamを実行しても、このメソッドを実行するのに2つのスレッドが使用されているようには見えません(元のワーカースレッドがこのUploadFromStream終了するには?)

私は、非同期のApiControllerは、HttpClient.GetAsyncやSqlCommand.ExecuteReaderAsyncなどのビルトイン非同期メソッドを使用している場合にのみ意味があることを理解しています。これらのメソッドはおそらくI/O完了ポートを内部的に使用しているので、実際の作業中にスレッドを解放することができます。だから私はこれにコードを変更する必要がありますか?一方

public Task PostAsync(int id) 
{ 
    // only to show it's using the proper async version of the method. 
    return TaskFactory.FromAsync(BeginUploadFromStream, EndUploadFromStream...) 
} 

Postメソッド内のすべての作業は、CPU /メモリ集約であれば、その後、非同期バージョンPostAsyncは、要求のスループットを助けにはなりません。通常の「public void Post(int id)」メソッドを使用する方が良いでしょうか?

多くの質問があります。うまくいけば、それはASP.NET MVCでの非同期使用の私の理解を明確にします。ありがとう。

答えて

1

はい、あなたの言うことのほとんどは正しいです。完成したポートなどで詳細までも。

I assume the original worker thread is waiting for this UploadFromStream to finish?

のみタスクスレッドが実行されている。ここで

は小さなエラーです。あなたは結局、非同期パイプラインを使用しています。それはタスクが終了するのを待つことはありません、それは単に継続をフックアップします。 (ちょうどHttpClient.GetAsyncのように)。

関連する問題