我刚刚开始在我的项目中使用 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("...");
}
}
但是我发现,当我使用 jQuery ajax 请求调用 LongRunningAction 时,我在此之后发出的任何进一步请求都会备份到它的后面,并且在 LongRunningAction 完成之前不会被处理。例如,调用耗时 10 秒的 LongRunningAction,然后调用不到一秒的 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) {
// ...
}
});
目前我只需要假设我使用它不正确,但我希望你们中的一个人可以清除我的心理障碍!