2012-03-14 26 views
0

こんにちは、私はAsynControllerを実装しようとしている、ここでAsyncControllerコールバックが呼び出されていない場合、呼び出す方法は?

は私のコードです:

[NoCache] 
public class GraphController : BaseAsyncController 
{ 
    private readonly IReportsRepository _reportsRepository; 
    private readonly ISqlQueryRepository _sqlQueryRepository; 

    //Background worker 
    private readonly BackgroundWorker _worker = new BackgroundWorker(); 

    public GraphController(ISqlQueryRepository sqlQueryRepository, IReportsRepository reportsRepository) 
    { 
     _sqlQueryRepository = sqlQueryRepository; 
     _reportsRepository = reportsRepository; 
    } 

    public void Index() 
    { 
     AsyncManager.OutstandingOperations.Increment(); 

     _worker.DoWork += (sender, args) => 
     { 
      AsyncManager.Parameters["message"] = "hello world"; 
      Thread.Sleep(3000); 
     }; 

     _worker.RunWorkerCompleted += (sender, args) => AsyncManager.OutstandingOperations.Decrement(); 
     //run the worker 
     _worker.RunWorkerAsync(); 
    } 

    public ActionResult IndexCompleted(string message) //callback not being invoked 
    { 
     ViewData["message"] = message; 
     return View(); 
    } 
} 

完了コールバックが呼び出されていない理由の質問はありますか?

ありがとうございます。

答えて

4

あなたの行動の名前が間違っています。 Indexであってはなりません。 IndexAsyncである必要があります。 following articleを見てください。これはASP.NET MVCでの非同期コントローラの使い方を示しています。

BackgroundWorkerはWindowsフォームコンポーネントです。 ASP.NETアプリケーションでWinFormsコンポーネントを使用しないでください。これらはサーバーアプリケーションで使用するようには設計されていません。私はあなたにTPLをお勧めしたいと思います。

ので:あなたはTPLを示唆するのはなぜ

[NoCache] 
public class GraphController : BaseAsyncController 
{ 
    private readonly IReportsRepository _reportsRepository; 
    private readonly ISqlQueryRepository _sqlQueryRepository; 

    public GraphController(ISqlQueryRepository sqlQueryRepository, IReportsRepository reportsRepository) 
    { 
     _sqlQueryRepository = sqlQueryRepository; 
     _reportsRepository = reportsRepository; 
    } 

    public void IndexAsync() 
    { 
     AsyncManager.OutstandingOperations.Increment(); 
     Task.Factory.StartNew(() => 
     { 
      // do the work 
      Thread.Sleep(3000); 

      // the work is finished => pass the results and decrement 
      AsyncManager.Parameters["message"] = "hello world"; 
      AsyncManager.OutstandingOperations.Decrement(); 
     }); 
    } 

    public ActionResult IndexCompleted(string message) 
    { 
     ViewData["message"] = message; 
     return View(); 
    } 
} 
+0

は、私はシンプルなスレッドを使用する可能性がありますか? – IamStalker

+1

@IamStalker、TPLをお勧めします。スレッドを手動で生成することは決して良い考えではありません。スレッドを生成するにはかなりのコストがかかる可能性があります。 TPLを使用することで、自動スレッドプーリング、タスクスケジューリング、使用可能なさまざまなCPUコアへの配布などの利点を活用できます。手動でスレッドを処理する場合は、数百行のコードを記述する必要があります。すべてのタスクのコンセプトに基づいて今後の.NET 4.5リリースはもちろんですが、 –

+0

まず、説明について、ありがとう、私は簡単な質問を言うかもしれません、なぜ "IndexAsync"は、アクションの名前が重要ですか? – IamStalker

関連する問題