Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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
C# 如何从CLR线程池而不是ASP.NET池在ASP.NET页面中创建线程?_C#_Asp.net_Multithreading_Clr_Threadpool - Fatal编程技术网

C# 如何从CLR线程池而不是ASP.NET池在ASP.NET页面中创建线程?

C# 如何从CLR线程池而不是ASP.NET池在ASP.NET页面中创建线程?,c#,asp.net,multithreading,clr,threadpool,C#,Asp.net,Multithreading,Clr,Threadpool,如果在ASP.NET页面上创建新线程,IsThreadPoolThread属性为true。 第一个问题是,它是来自ASP.NET池还是CLR池? 第二个问题是,如果它来自ASP.NET池,那么如何从CLR创建线程而不使用ASP.NET池? 我需要一个用于长时间运行的请求()的同步解决方案。首先,ASP.NET线程池和CLR线程池之间没有区别。ASP.NET处理CLR线程池上的页面,因此ASP.NET页面将始终具有IsThreadPoolThread==true 我很好奇你是如何创建你的线程的。您

如果在ASP.NET页面上创建新线程,
IsThreadPoolThread
属性为true。 第一个问题是,它是来自ASP.NET池还是CLR池? 第二个问题是,如果它来自ASP.NET池,那么如何从CLR创建线程而不使用ASP.NET池?
我需要一个用于长时间运行的请求()的同步解决方案。

首先,ASP.NET线程池和CLR线程池之间没有区别。ASP.NET处理CLR线程池上的页面,因此ASP.NET页面将始终具有IsThreadPoolThread==true

我很好奇你是如何创建你的线程的。您是使用System.Threading.Thread构造函数,还是使用ThreadPool.QueueUserWorkItem?如果您使用的是ThreadPool.QueueUserWorkItem,那么您获得的线程来自常规的.net线程池


最后,正如我所说,在ASP.NET中尝试长时间运行的任务总是一个坏主意。我的一般建议是使用后台windows服务来处理这些请求,因为ASP.NET可能会在任何时候终止后台线程。如果您必须在IIS中执行此操作,请参阅此处的更多详细信息:

虽然要尽量减少对事务的影响并考虑分布式事务中的不可预见性,但在本例中,确实没有必要仅仅因为进程运行时间长而重新创建IIS。整个“IIS随时可能死亡”的迷因被大大夸大了

是的,您可以手动重新启动IIS或应用程序池,但您也可以重新启动执行相同任务以获得相同效果的任何其他服务。至于自动回收,IIS使用重叠的工作进程,并且永远不会强制终止已启动的线程(除非发生超时)。如果是这种情况,那么任何托管应用程序都会出现严重问题(如何阻止IIS在启动后0.001ms终止快速响应线程)

本质上,让IIS做IIS最擅长的事情,不要坚持同步操作,你只会浪费池中的线程等待阻止I/O,我认为这是你试图避免的。您已经做出了一个很好的选择,使用异步处理程序(ASHX),使用
IHttpAsyncHandler
实现生成自定义线程,然后在不影响web应用程序及其池的情况下按您的意愿阻塞。一旦启动异步操作线程,asp.net线程将返回到自己的池,并准备开始服务新请求。在池中默认限制为100个线程的情况下,并且考虑到您的进程的cpu占用率较低,带宽较高,我想在管道空间用完之前,您永远不会用完池线程:)。有关如何构建异步处理程序的更多信息,请查看此链接(这是一篇旧文章,但无效):


事实上,ASP.NET中的线程是不同的:工作线程和IO线程(系统线程,我相信您将其称为CLR线程)

现在ASP.NET在每个请求上使用一个工作线程,除非使用自定义配置,并且这些工作线程受CPU数量的限制;可以在IIS中设置此配置。 例如,当您使用委托在ASP.NET中启动异步任务时,您使用的是另一个工作线程。委托是在.NET中启动异步操作的一种快速而肮脏的方式:)

如果要启动一个不使用工作线程的新线程,则必须显式启动一个新线程,如:new thread()…等。现在,它附带了很多代码管理,并且不遵循基于事件的异步模式。 但是,有一种方法可以安全地启动异步线程,那就是在对象上使用.NET自己的异步方法。您通常使用asynch处理SQL命令、webservice调用等。所有这些都有一个BEGIN和一个END方法。 通过使用这些方法,您将永远不会使用工作线程,而是使用IO线程

ASP.NET在异步页面方面有一些技巧。 有两种选择:

  • 异步页面:使页面循环为异步的。这基本上意味着页面请求是异步的
  • 异步页面任务:用于定义在页面启动时启动异步的任务。它有点像异步线程,只是ASP.NET为您做了很多事情,而且限制更大
  • 我没有所有的细节,但请查看MSDN库上的两个选项。
    这里有一篇关于这个主题的文章:

    当然,从asp.net手动构建一个新线程不会导致IsThreadPoolThread被设置为true,对吗?所以他一定是在给QueueUserWorkItem打电话。如果我错了,请纠正我。对,我只是为了自己的理智而断言。对于那些线程,IsThreadPoolThread应该是false。你确定它返回的是真的吗?这里还有一些: