关于c#:为繁重的任务设置低线程优先级

Setting a low thread priority for a heavy load task

首先,感谢您的所有答复!

我想更具体一点-我有一个网站,显示一些当前和历史报告。 我希望能够在继续浏览网站的同时允许用户删除全部或部分历史记录。

因此,我想运行一个单独的线程来处理删除数据,但是我想给该线程一个低优先级,以免使网站变慢或反应迟钝。

我目前正处于设计阶段,希望能提出一些策略建议。 谢谢!


你应该没事的。降低CPU密集型后台任务的优先级,以允许来自GUI和/或其他应用程序的"正常"响应是更改线程优先级的更好方法之一。

请注意,降低线程优先级不会对除CPU以外的任何资源产生巨大影响,但仍然值得进行IME。

如果要在运行应用程序时继续使用Firefox,Office,VLC等,则可以降低CPU密集线程的优先级。然后,您应该能够浏览SO,听一些专辑或看几部电影,同时等待结果最终出来:)


请注意,如果要更改线程的优先级,则应确保该线程是您自己创建的。更改线程池线程的优先级不是很好。这意味着避免使用新的任务功能,除非您准备编写不使用线程池的TaskScheduler

如果适合您的情况,还可以考虑设置进程优先级。有关更多信息,请参见MSDN。这将同样影响线程。

编辑:感谢您的其他信息。听起来好像您的代码托管在IIS中。从此答案中,我们可以确认IIS使用与ThreadPool.QueueUserWorkItem(标准.NET线程池)相同的线程池。因此,您不得更改线程池线程的优先级。这些线程属于IIS。

您可以创建自己的线程。但是似乎不建议尝试像这样在IIS中托管后台操作。例如,您永远不知道何时可以回收应用程序池。

  • 最好考虑其他两个选择。对于可能长时间运行的后台操作,最好的解决方案似乎是工作流服务。与AppFabric Server结合使用,它们非常强大且听起来不错,好像它们可以处理您的情况一样。
  • 一个更简单的选择是将进程移出IIS。也许用户的操作可以标记要删除的项目,然后IIS之外的计划任务可以运行以执行慢速操作。


我将使用ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(MyDeleteMethod),itemsTobeDeleted)

在MyDeleteMethod中,您可以考虑以不同的批量破坏删除过程。换句话说,每次运行delete方法时,您都可以指定要删除的最大行数。

如果您担心数据库池中的可用连接数,可以通过定义一个静态对象(使用计时器)并将itemTobeDeleted添加到该列表中来提高性能(您需要使用锁进行同步访问)。每当计时器Elapsed事件触发时,您都可以执行批量删除(例如,您有5,000条记录,而您将通过500删除500条记录)。