Asp.net mvc asp.net mvc、IIS、线程等
网络专家 有一个问题,我和我的同事们无法找到一个令我们所有人都满意的答案 在我们的网站上,总是有一个沉重的负载,我们需要运行一些长期运行的任务异步(图像处理,缓存建设,…)。最初的实现是为每个这样的请求使用Asp.net mvc asp.net mvc、IIS、线程等,asp.net-mvc,multithreading,asp.net-mvc-4,iis,iis-8,Asp.net Mvc,Multithreading,Asp.net Mvc 4,Iis,Iis 8,网络专家 有一个问题,我和我的同事们无法找到一个令我们所有人都满意的答案 在我们的网站上,总是有一个沉重的负载,我们需要运行一些长期运行的任务异步(图像处理,缓存建设,…)。最初的实现是为每个这样的请求使用线程对象。我认为使用可能是一种过度的杀伤力,在无法创建更多线程的情况下也会发生这种情况。我采取了使用“Task.Run”的方法来处理所有此类请求,这些请求在幕后使用了线程池 我被告知这也不好,因为IIS应用程序池本身正在使用ThreadPool,并且可能会出现这样的情况,即这些后台任务将阻塞以
线程
对象。我认为使用可能是一种过度的杀伤力,在无法创建更多线程的情况下也会发生这种情况。我采取了使用“Task.Run”的方法来处理所有此类请求,这些请求在幕后使用了线程池
我被告知这也不好,因为IIS应用程序池
本身正在使用ThreadPool
,并且可能会出现这样的情况,即这些后台任务将阻塞以服务于通常的HTTP请求,这也是正确的
这里最好采用什么方法:线程
或任务
我知道最好的办法是将所有这些提取到Windows服务和某种队列中,但目前我们还不能这样做
任何其他意见都是非常受欢迎的
谢谢。简单后台线程是ASP.NET环境中长时间运行任务的最佳方式
System.Threading.ThreadStart threadStart = delegate { SomeJob(someData); };
System.Threading.Thread thread = new System.Threading.Thread(threadStart);
thread.IsBackground = true;
thread.Start();
如果您喜欢使用封装到任务中的任务调度程序,可以实现自己的任务调度程序
,它使用后台线程而不是线程池对任务进行排队,请参见MSDN-上的示例
对于从HTTP处理程序内部启动的长时间运行的任务,还有一个使用异步HTTP处理程序的选项,请参见此处的示例-。将任何长时间运行的任务从ASP.NET中移出,以分离Windows服务或Azure worker角色,您将节省大量工作。