2011-01-23 19 views
2

ASP.NET MVC 1を使用して開発した "ブログ" Webサイトがあります。最近のMVCにはAsyncController機能が含まれています。これは、実際に開発にいくつかの追加タスクを必要とします。しかし、ビジネス層を変更せずに既存のコードを再利用するにはどうすればよいですか?ASP.NET MVCの非同期コントローラ

コードの一部は、次のようになります。現在の環境を1として

BlogPost post = new BlogPost(); 
post.GetPost(58345); 

BlogComment comments = new BlogComment(); 
comments.GetComments(58345); 

、私は、要求が2つの操作を完了するまで待つ必要があります。 AsyncControllerを使用して、私は2つの操作を同時に行うことができます。しかし、BlogPostクラスとBlogCommentクラスは、操作が完了したかどうかを知るためにEventHandlerを追加するなどの非同期操作をサポートするように変更する必要があります。

既存のビジネスレイヤーを変更せずに非同期操作を行う方法

+0

最大、これには解決策を見つけることができましたか?私は同様のボートにあり、既存のBLL(Business Logic Layer)メソッドをAsyncControllerを使用して、BLLに変更または追加することなくAsyncoulsyメソッドと呼びたいと思っています。私はあなたの応答/提案に非常に感謝します。あなたは私の質問をここに見ることができます:http://stackoverflow.com/questions/5760285/changing-synchronous-operations-into-asynchronous-in-business-service-repositor – Alex

答えて

2

まず、なぜ非同期コントローラを実行する必要があると思いますか?あなたは、Asyncがあなたを助けると思うパフォーマンス上の問題を経験していますか?アプリケーションを本当に必要としない場合、非同期処理でアプリケーションを複雑にするのはなぜですか?

Asyncは、はるかに大規模なスケーリングを処理するため、またはコントローラで非CPUバインド操作を実行する必要がある場合に、実行に時間がかかることがあります。

第2に、Asyncコントローラがどのように動作するのかちょっと混乱していると思います。ほとんどの場合、ビジネスレイヤーを変更する必要はありません。単にビジネスレイヤーをラップするために非同期の "シム"を作成するだけです。 Asyncは「マルチスレッド」を意味するものではありません。要求ごとに1つのスレッドを実行しますが、ビジネスロジックをシングルスレッドで呼び出すことになります(マルチスレッドの処理を行うコードを記述しない限り)。

すべての非同期コントローラでは、スレッドプールの利用効率を上げることができます。 CPUにバインドされていないスレッドがある場合は、リクエストを再度アクティブにするのを待つ間にスレッドプールに返すことができるため、スレッドプールを使用するのではなく、スレッドプールを利用できるようになります。

複数の操作を呼び出す必要がある場合は、AsyncManager.OutstandingOperationsプロパティを使用して、要求の完了に必要なオペレータの数を制御します。

3

あなたはこれを行うことができます:

public class BlogController : AsyncController 
{ 
    private readonly IBlogRepository _repository; 
    public BlogController(IBlogRepository repository) 
    { 
     _repository = repository; 
    } 

    public void ShowAsync(int id) 
    { 
     AsyncManager.OutstandingOperations.Increment(2); 
     new Thread(() => 
     { 
      AsyncManager.Parameters["post"] = _repository.GetPost(id); 
      AsyncManager.OutstandingOperations.Decrement(); 
     }).Start(); 
     new Thread(() => 
     { 
      AsyncManager.Parameters["comments"] = _repository.GetComments(id); 
      AsyncManager.OutstandingOperations.Decrement(); 
     }).Start(); 
    } 

    public ActionResult ShowCompleted(Post post, IEnumerable<Comment> comments) 
    { 
     return View(new BlogViewModel 
     { 
      Post = post, 
      Comments = comments, 
     }); 
    } 
} 

あなたは、アプリケーションのパフォーマンスを測定し、非同期コントローラを導入することは、パフォーマンスに何らかの価値をもたらすかどうかを決定する必要があります。

+2

あなたのスレッドプールでの処理は本当に非同期コントローラ。要求はスレッドプールワーカーによって処理されます。スレッドプール上で作業をキューイングすると、スレッドプールにスレッドが戻され、ワー​​カープロセスによって再度使用されるだけです。さらに悪いことに、2つのスレッドを使用しています。 –

+0

@ミスター・マン、あなたは私の記事の最後を読まなかったのですか?私はコードにコメントを入れて、これをより明白にすることが重要です。ありがとう。 –

+1

はい、私はあなたの記事の最後を読んだ。私はそれが私の要点と何か関係があるのか​​分かりません。はい、スレッドプールを使用するのではなく、長時間実行しているスレッドを独自のスレッドに配置することは、常に良い考えです。私のポイントは、非同期を使用すると、スレッドプールを使用するのはポイントがなく、最初の場所で実行してはならないということです。なぜなら、これは利点が得られないからです。 –

関連する問題