我想知道以下代码是否有任何在网络服务器上运行时我不知道的问题。阅读优秀系列http://reedcopsey.com/series/parallelism-in-net4/我无法找到任何与我的问题有关的内容,与msdn一样,所以我想我会把它带到这里。
示例电话:
public ActionResult Index() {
ViewBag.Message = "Welcome to ASP.NET MVC!";
Task.Factory.StartNew(() => {
//This is some long completing task that I don't care about
//Say logging to the database or updating certain information
System.Threading.Thread.Sleep(10000);
});
return View();
}
答案 0 :(得分:5)
ASP.Net支持异步页面,请参阅Asynchronous Pages in ASP.NET,但它是一个复杂的编程模型,并且根本不与MVC绑定。话虽这么说,从同步请求处理程序启动异步任务可以解决问题:
答案 1 :(得分:4)
在这种情况下,一个重要的事情是确保任务中包含的代码包装在try / catch块中,或者在此线程中抛出的任何可能的异常都将传播。您还应该确保在这个长时间运行的任务中,您没有访问任何Http Context成员,例如Request,Response,Session ......,因为它们在您访问它们时可能不再可用。
答案 2 :(得分:0)
使用new Thread
代替Task.Factory.StartNew
。 Task.Factory.StartNew
使用来自线程池的线程,如果你有许多后台任务,线程池将耗尽线程并降低你的web应用程序。请求将排队,您的网络应用程序最终将死亡:)
您可以使用Thread.CurrentThread.IsThreadPoolThread
测试在线程池上执行的后台工作。如果你得到True,则使用线程池。