Я только начал использовать 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 с помощью jjuery 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) {
// ...
}
});
В данный момент я просто должен предположить, что я использую это неправильно, но я надеюсь, что один из вас, ребята, сможет очистить мой умственный блок!