Обратный вызов AsyncController не вызывается, как его вызвать? - PullRequest
0 голосов
/ 14 марта 2012

Здравствуйте, я пытаюсь реализовать 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();
    }
}

Вопрос в том, почему завершенный обратный вызов не вызывается?

Заранее спасибо.

1 Ответ

4 голосов
/ 14 марта 2012

Название вашего действия неверно.Не должно быть Index.Это должно быть IndexAsync.Взгляните на следующую статью , которая иллюстрирует использование асинхронных контроллеров в ASP.NET MVC.

Обратите внимание, что BackgroundWorker является компонентом Windows Form.Не используйте компоненты WinForms в приложениях ASP.NET.Они не предназначены для использования в серверных приложениях.Я бы порекомендовал вам 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();
    }
}
...