Jas*_*son 24 javascript c# jquery asp.net-mvc-2
我刚开始在我的项目中使用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("...");
}
}
Run Code Online (Sandbox Code Playgroud)
但我发现的是,当我使用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) {
// ...
}
});
Run Code Online (Sandbox Code Playgroud)
目前我不得不假设我使用不正确,但我希望你们中的一个能清除我的精神障碍!
Lev*_*evi 31
这里有两个问题.首先,您的控制器不是真正的异步.启动ThreadPool线程来执行工作通常具有比从action方法本身执行所有操作更糟糕的性能特征,因为您仍然从ASP.NET(它只是共享CLR ThreadPool)获取ThreadPool资源,而您现在强制CLR和操作系统处理线程.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ee728598.aspx#choosing_synchronous_or_asynchronous_action_methods.基本上,该链接归结为如果您不能使用I/O完成端口进行异步操作,则不太可能看到性能提升.
第二个问题是ASP.NET MVC对所有请求进行会话锁定.单个会话中的多个请求将始终被序列化,否则如果一个控制器写入Session而另一个控制器正在尝试读取它,则用户的会话可能会损坏.有关上下文和解决方法,请参见http://forums.asp.net/t/1501623.aspx.MVC 2 Futures有一种禁用此锁的方法; 它也可能包含在MVC 3中.有关详细信息,请参阅https://blogs.msdn.com/b/rickandy/archive/2009/12/17/session-less-mvc-controller.aspx.
| 归档时间: |
|
| 查看次数: |
14803 次 |
| 最近记录: |