5

MVC4 ApiController を使用して Azure Blob にデータをアップロードしています。サンプルコードは次のとおりです。

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

このコードは意味がありますか? ASP.NET は既にワーカー スレッドでリクエストを処理していると思うので、別のスレッドで UploadFromStream を実行しても意味がないように思われます。これは、このメソッドを実行するために 2 つのスレッドを使用するようになったためです (元のワーカー スレッドがこの UploadFromStream を待っていると仮定します)。終わる?)

したがって、非同期 ApiController は、HttpClient.GetAsync や SqlCommand.ExecuteReaderAsync などの組み込みの非同期メソッドを使用している場合にのみ意味があると理解しています。これらのメソッドはおそらく I/O Completion Ports を内部的に使用するため、実際の作業を行いながらスレッドを解放できます。だから私はこれにコードを変更する必要がありますか?

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 での非同期の使用に関する私の理解が明確になることを願っています。ありがとう。

4

1 に答える 1

1

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

ここに小さなエラーがあります:

元のワーカースレッドがこのUploadFromStreamの終了を待っていると思いますか?

タスクスレッドのみが実行されています。結局のところ、非同期パイプラインを使用しています。タスクが終了するのを待たずに、継続をフックするだけです。(HttpClient.GetAsyncと同じように)。

于 2013-02-09T09:04:26.970 に答える