3

首先,感谢大家的回复!

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

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

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

4

3 回答 3

2

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

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

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

于 2012-09-05T15:21:29.627 回答
1

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

如果适合您的场景,还可以考虑设置流程优先级。有关详细信息,请参阅MSDN。这将同样影响线程。

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

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

  • 最好考虑其他几个选项。可能长时间运行的后台操作的最佳解决方案似乎是工作流服务。与 AppFabric Server 一起使用时,这些功能非常强大且听起来好像它们可以处理您的情况。
  • 一个更简单的替代方法是将进程移到 IIS 之外。也许用户的操作可以将项目标记为删除,然后可以运行 IIS 之外的计划任务来执行缓慢的操作。
于 2012-09-05T15:27:29.440 回答
0

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

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

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

于 2012-09-06T11:17:31.887 回答