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();
    }
}