首先,感谢所有回复!
我想更具体一点 - 我有一个网站,显示一些当前和历史报告。我希望能够允许用户删除全部或部分历史记录,同时仍然可以浏览网站。
因此,我想运行一个单独的线程来处理删除数据,但我想给这个线程一个低优先级,所以它不会使网站变慢或无响应。
我现在正处于设计阶段,我很欣赏一些策略建议。谢谢!
答案 0 :(得分:2)
你应该没事。降低CPU密集型后台任务的优先级以允许来自GUI和/或其他应用程序的“正常”响应是改变线程优先级的更好用途之一。
请注意,降低线程优先级不会对除CPU以外的任何资源产生巨大影响,但仍值得进行IME。
如果你想在运行你的应用程序时继续使用Firefox,Office,VLC等,那么,是的,降低CPU密集线程的优先级。然后你应该能够浏览SO,听一些专辑或观看几部电影,同时等待你的结果最终出来:)
答案 1 :(得分:1)
请注意,如果要更改线程的优先级,则应确保它是您自己创建的线程。更改线程池线程的优先级并不好。这意味着要避免使用新的任务功能,除非您准备编写不使用线程池的TaskScheduler
。
如果适合您的情况,还可以考虑设置进程优先级。有关详细信息,请参阅MSDN。这会平等地影响线程。
编辑:感谢您提供更多信息。听起来好像您的代码托管在IIS中。从this answer我们可以确认IIS使用与ThreadPool.QueueUserWorkItem相同的线程池 - 标准.NET线程池。因此,您不得更改线程池线程的优先级;这些线程属于IIS。
你可以创建自己的主题。但似乎不建议尝试在IIS中托管后台操作。例如,您永远不知道应用程序池何时可以回收。
答案 2 :(得分:0)
我会使用ThreadPool.UnsafeQueueUserWorkItem(新的WaitCallback( MyDeleteMethod ), itemsTobeDeleted )
在 MyDeleteMethod 中,您可以考虑在不同的批量处理中断删除过程。换句话说,您可以指定每次运行delete方法时要删除的最大行数。
如果您担心数据库池中的可用连接数,可以通过定义静态对象(带有计时器)并将 itemsTobeDeleted 添加到该列表来提高性能(需要使用锁进行同步访问)。每当计时器Elapsed事件触发时,您都可以执行批量删除(例如,您有5,000条记录,并且您要将其删除500乘500)。