为重负载任务设置低线程优先级

时间:2012-09-05 15:12:50

标签: c# .net multithreading cpu-usage thread-priority

首先,感谢所有回复!

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

因此,我想运行一个单独的线程来处理删除数据,但我想给这个线程一个低优先级,所以它不会使网站变慢或无响应。

我现在正处于设计阶段,我很欣赏一些策略建议。谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

如果适合您的情况,还可以考虑设置进程优先级。有关详细信息,请参阅MSDN。这会平等地影响线程。

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

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

  • 最好考虑其他两种选择。可能长时间运行的后台操作的最佳解决方案似乎是workflow services。与AppFabric Server结合使用时,这些功能非常强大,听起来好像可以处理您的情况。
  • 更简单的替代方法是将进程移出IIS。也许用户的操作可以标记要删除的项目,然后IIS外部的计划任务可以运行以执行缓慢的操作。

答案 2 :(得分:0)

我会使用ThreadPool.UnsafeQueueUserWorkItem(新的WaitCallback( MyDeleteMethod ), itemsTobeDeleted

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

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