Я только начал использовать AsyncController в своем проекте, чтобы позаботиться о некоторых длительных отчетах. Казалось бы идеальным в то время, когда я мог бы начать отчет, а затем выполнить несколько других действий, ожидая его возвращения и заполнения элементов на экране.
Мой контроллер выглядит примерно так. Я попытался использовать поток для выполнения длинной задачи, которую, я надеялся, высвободил бы контроллер, чтобы получить больше запросов:
public class ReportsController : AsyncController
{
public void LongRunningActionAsync()
{
AsyncManager.OutstandingOperations.Increment();
var newThread = new Thread(LongTask);
newThread.Start();
}
private void LongTask()
{
// Do something that takes a really long time
//.......
AsyncManager.OutstandingOperations.Decrement();
}
public ActionResult LongRunningActionCompleted(string message)
{
// Set some data up on the view or something...
return View();
}
public JsonResult AnotherControllerAction()
{
// Do a quick task...
return Json("...");
}
}
Но то, что я нахожу, заключается в том, что когда я вызываю LongRunningAction с помощью jQuery ajax-запроса, любые последующие запросы, которые я делаю после этого, поддерживают его и не обрабатываются до завершения LongRunningAction. Например, вызовите LongRunningAction, который занимает 10 секунд, а затем вызывает AnotherControllerAction, который меньше секунды. AnotherControllerAction просто ждет завершения LongRunningAction перед возвратом результата.
Я также проверил код jQuery, но это все равно, если я специально установил "async: true":
$.ajax({
async: true,
type: "POST",
url: "/Reports.aspx/LongRunningAction",
dataType: "html",
success: function(data, textStatus, XMLHttpRequest) {
// ...
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
// ...
}
});
В настоящий момент я просто должен предположить, что я использую его неправильно, но я надеюсь, что один из вас, ребята, сможет очистить мой ментальный блок!