I have just started using the AsyncController in my project to take care of some long-running reports. Seemed ideal at the time since I could kick off the report and then perform a few other actions while waiting for it to come back and populate elements on the screen.
My controller looks a bit like this. I tried to use a thread to perform the long task which I'd hoped would free up the controller to take more requests:
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("...");
}
}
But what I am finding is that when I call LongRunningAction using the jQuery ajax request, any further requests I make after that back up behind it and are not processed until LongRunningAction completes. For example, call LongRunningAction which takes 10 seconds and then call AnotherControllerAction which is less than a second. AnotherControllerAction simply waits until LongRunningAction completes before returning a result.
I've also checked the jQuery code, but this still happens if I specifically set "async: true":
$.ajax({
async: true,
type: "POST",
url: "/Reports.aspx/LongRunningAction",
dataType: "html",
success: function(data, textStatus, XMLHttpRequest) {
// ...
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
// ...
}
});
At the moment I just have to assume that I'm using it incorrectly, but I'm hoping one of you guys can clear my mental block!