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