2012-03-14 1 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 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(); 
    } 
} 
+0

Почему вы предлагаете TPL, могу я использовать простую тему? – IamStalker

+1

@IamStalker, я бы рекомендовал TPL. Врожденные нерестовые нити никогда не являются хорошей идеей. Было бы довольно дорого порождать поток. Используя TPL, вы получите лучшее преимущество в таких областях, как автоматическое объединение потоков, планирование задач и распределение по различным доступным ядрам процессора ... что вам нужно написать сотни строк кода для достижения, если вы вручную работаете с потоками. Не говоря уже о предстоящей версии .NET 4.5, которая основана на концепции задач. –

+0

спасибо вам в первую очередь, об этом объяснении, во-вторых, я могу сказать простой вопрос, «почему IndexAsync» имеет значение, какое имя Действие? – IamStalker