Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc asp.net mvc、IIS、线程等_Asp.net Mvc_Multithreading_Asp.net Mvc 4_Iis_Iis 8 - Fatal编程技术网

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角色,您将节省大量工作。