Asp.net mvc 3 未调用AsyncController回调,如何调用它?
您好,我正在尝试实现一个异步控制器 这是我的密码:Asp.net mvc 3 未调用AsyncController回调,如何调用它?,asp.net-mvc-3,c#-4.0,asynccontroller,Asp.net Mvc 3,C# 4.0,Asynccontroller,您好,我正在尝试实现一个异步控制器 这是我的密码: [NoCache] public class GraphController : BaseAsyncController { private readonly IReportsRepository _reportsRepository; private readonly ISqlQueryRepository _sqlQueryRepository; //Background worker private re
[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();
}
}
问题是为什么不调用已完成的回调
提前感谢。您的行为名称是错误的。它不应该是
索引
。它应该是IndexAsync
。请看演示ASP.NET MVC中异步控制器用法的
请注意,BackgroundWorker是一个Windows窗体组件。不要在ASP.NET应用程序中使用WinForms组件。它们不是为在服务器应用程序中使用而设计的。我向你推荐第三方物流
因此:
你行为的名称是错误的。它不应该是
索引
。它应该是IndexAsync
。请看演示ASP.NET MVC中异步控制器用法的
请注意,BackgroundWorker是一个Windows窗体组件。不要在ASP.NET应用程序中使用WinForms组件。它们不是为在服务器应用程序中使用而设计的。我向你推荐第三方物流
因此:
@我是跟踪者,我推荐TPL。手动生成线程从来不是一个好主意。生成线程可能会非常昂贵。通过使用TPL,您将更好地利用自动线程池、任务调度和在不同可用CPU核上的分配等功能。。。如果您手动使用线程,您应该编写数百行代码来实现这些功能。更不用说即将发布的.NET 4.5版本了,它完全基于任务的概念。首先,谢谢你的解释,其次我有一个简单的问题,“为什么IndexAsync”动作的名称重要吗?@iamstapper,是的,名称重要。您需要两种方法:第一种是
XXXAsync
,第二种是XXXCompleted
,其中XXX
是您在url中查询操作的名称:/graph/XXX
。请阅读我在回答中链接到的文章。所有这些都解释得很好。@iamstapper,我推荐TPL。手动生成线程从来不是一个好主意。生成线程可能会非常昂贵。通过使用TPL,您将更好地利用自动线程池、任务调度和在不同可用CPU核上的分配等功能。。。如果您手动使用线程,您应该编写数百行代码来实现这些功能。更不用说即将发布的.NET 4.5版本了,它完全基于任务的概念。首先,谢谢你的解释,其次我有一个简单的问题,“为什么IndexAsync”动作的名称重要吗?@iamstapper,是的,名称重要。您需要两种方法:第一种是XXXAsync
,第二种是XXXCompleted
,其中XXX
是您在url中查询操作的名称:/graph/XXX
。请阅读我在回答中链接到的文章。所有这些都解释得很好。
[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();
}
}