0

你好我正在尝试实现一个 AsynController,

这是我的代码:

[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

1 回答 1

4

您的操作名称错误。不应该Index。应该是IndexAsync。看看下面的文章,它说明了异步控制器在 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();
    }
}
于 2012-03-14T07:27:35.547 回答