2012-03-14 94 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。

所以:

[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

为什么你建议TPL,可能我用一个简单的主题? – IamStalker 2012-03-14 07:55:50

+1

@IamStalker,我推荐TPL。手动产卵线程永远不是一个好主意。产生一个线程可能相当昂贵。通过使用TPL,您将更好地利用诸如自动线程池,任务调度和分布在不同的可用CPU内核之类的东西......如果您手动使用线程,则应该编写数百行代码才能实现的目标。更不用说即将发布的.NET 4.5版本,它们都基于任务的概念。 – 2012-03-14 08:00:04

+0

首先感谢你,关于解释,第二我有我可能会说简单的问题,“为什么IndexAsync”这是否重要的​​Action的名称? – IamStalker 2012-03-14 08:04:45