2011-08-08 10 views
1

ASP.NET MVCで、完了したアクションで非同期アクションを作成すると、自動的に非同期で処理されますか?Asp MVC非同期コントローラアクションは自動的に非同期ですか?

例:

私は、デリゲートを宣言しなくても、単一の実行時間の長いタスクを持っているとしたら、非同期ボイドが自動的にバックグラウンドスレッドで実行されていますか?

public void NewsAsync(string city) { 

    AsyncManager.OutstandingOperations.Increment(); 
    NewsService newsService = new NewsService(); 
    AsyncManager.Parameters["headlines"] = newsService.GetHeadlines; 
    AsyncManager.OutstandingOperations.Decrement(); 
} 

長時間実行されているタスクが非同期タスクの場合のみ実行しますか?空洞内部のメソッドが非同期である場合

public void NewsAsync(string city) { 

    AsyncManager.OutstandingOperations.Increment(); 
    NewsService newsService = new NewsService(); 
    newsService.GetHeadlinesCompleted += (sender, e) => 
    { 
     AsyncManager.Parameters["headlines"] = e.Value; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    newsService.GetHeadlinesAsync(city); 
} 

ので、他の言葉で、私は気にしないが、私は、IISのスレッドを解放するように、それは自己だボイドは非同期であれば気にしません。

答えて

1

最初のコード例は意味をなさないものです。 NewsAsyncはできるだけ早く戻り、バックグラウンドスレッドに作業を委任する必要があります。 2番目の例のように結果をビューに渡すのはNewsCompletedアクションです。

これらのバックグラウンドスレッドに関しては、このNewsService.GetHeadlinesCompletedメソッドがどのように実装されているかに依存します。非同期コントローラの可能な最良のシナリオには、I/O Completion Portsを使用して実行できる長時間実行される入出力操作(Webサービス呼び出し、データベースクエリなど)があります。この状況では、要求の実行中にスレッドが独占されることはありません。同期操作を非同期に実行しようとするような状況(これは、最初のコード例で試しているようです)では、非同期コントローラの利点は非常に疑わしく、状況を悪化させる可能性もあります。

ASP.NETでの非同期操作の詳細については、following article on MSDNをお勧めします。ここでは非同期ページについて説明しますが、内部では非同期ハンドラ(IHttpAsyncHandlerインターフェイスを使用)として実装されているASP.NET非同期コントローラにまったく同じ概念が適用されます。

関連する問題