【发布时间】:2011-02-25 01:03:30
【问题描述】:
我刚刚开始在我的项目中使用 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 完成之前不会被处理。例如,调用 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) {
// ...
}
});
目前我只能假设我用错了,但我希望你们中的一个人能清除我的心理障碍!
【问题讨论】:
-
您是在 IIS 还是 WebDev 上执行此操作?嗯,WebDev 与 IIS 相比,是“不那么激进的多线程”。
-
我也有同样的问题,请问你是怎么解决的?
标签: c# javascript asp.net-mvc-2 jquery