Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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# 在web应用程序中使用ThreadPool.QueueUserWorkItem有什么缺点吗。_C#_Asp.net Mvc - Fatal编程技术网

C# 在web应用程序中使用ThreadPool.QueueUserWorkItem有什么缺点吗。

C# 在web应用程序中使用ThreadPool.QueueUserWorkItem有什么缺点吗。,c#,asp.net-mvc,C#,Asp.net Mvc,我在这个问题上做了一些研究,但我无法找到预期的答案。在我的应用程序中,我使用了 ThreadPool.QueueUserWorkItem 我喜欢这样 ThreadPool.QueueUserWorkItem(o => CaseBll.SendEmailNotificationForCaseUpdate(currentCase, caseUpdate)); 我在asp.net mvc中的应用程序&我已经处理了所有后台任务,这些任务不需要在用户操作中执行,以实现更快的执行和快速的用户响应。

我在这个问题上做了一些研究,但我无法找到预期的答案。在我的应用程序中,我使用了

ThreadPool.QueueUserWorkItem

我喜欢这样

ThreadPool.QueueUserWorkItem(o => CaseBll.SendEmailNotificationForCaseUpdate(currentCase, caseUpdate));
我在asp.net mvc中的应用程序&我已经处理了所有后台任务,这些任务不需要在用户操作中执行,以实现更快的执行和快速的用户响应。
现在我想知道,当我们有更多的应用程序受众时,使用ThreadPool.QueueUserWorkItem是否有任何不好的一面

这实际上取决于你将要做什么,但一般来说,你可能会担心:

  • 坚持。托管池中的线程是后台线程。当应用程序循环使用时,它们将死亡,这通常是不可取的。在您的情况下,您希望发送电子邮件。想象一下,如果进程在线程执行之前由于某种原因死亡。您的电子邮件将永远不会被发送
  • 本地存储是共享的,这意味着您需要确保在使用上一个线程时没有剩余的内存。也适用于用ThreadStaticAttribute标记的字段

相反,我建议您实施一个作业方案,将作业安排在某个地方,并让其他一些组件实际从该列表中读取(例如,数据库)并执行作业,然后将其标记为完成。通过这种方式,它在整个应用程序卸载过程中保持不变,没有内存重用,并且可以限制性能。您可以在应用程序中实现处理组件,甚至可以将其作为Windows服务来实现。

不,您不应该使用它。我可以写很多理由,但是你应该读一读斯科特·汉斯勒曼的这篇文章,他是一个天才

在“可靠性和性能”下:

启动并忘记工作-避免使用ThreadPool.QueueUserWorkItem,因为您的应用程序池可能随时消失。如果必须,请将此作业移到室外或使用WebBackgrounder

因此,按照建议,不要使用ThreadPool.QueueUserWorkItem。一个很好的替代方案是:

编辑:正如@Scott Chamberlain提到的,这里有一个更好的链接:

这里有一篇更新更好的博客文章,专门介绍如何在ASP.net中进行背景工作:我不会说你“永远不要使用它”。只有西斯领主是绝对的…:-)在某些情况下,使用此类是有意义的。