2

我需要以不同的优先级异步调用几个方法。

我的第一个想法是使用 ThreadPool 并像这样更改 Thread 的优先级:

static void Run()
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod));
}

static void SomeMethod(object o)
{
  Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok?
  // do some work here
}

这行得通还是你有什么建议?

4

3 回答 3

4

根据http://msdn.microsoft.com/en-us/library/0ka9477y.aspx,如果您的目标是 2.0,它将不起作用,它暗示 3.5 存在一些差异,但没有特别提及优先级:

何时不使用线程池线程

有几种场景适合创建和管理自己的线程而不是使用线程池线程:

  • 您需要一个前台线程。

  • 您需要一个线程具有特定的优先级。

  • 您的任务会导致线程长时间阻塞。线程池具有最大线程数,因此大量阻塞的线程池线程可能会阻止任务启动。

  • 您需要将线程放入单线程单元中。所有 ThreadPool 线程都在多线程单元中。

  • 您需要有一个与线程相关联的稳定身份,或者将线程专用于某项任务。

您可能需要提出自己的实现,并直接处理线程的创建。

问题:您要实现什么目标?您有一组要处理的任务,并且您希望优先级高的任务先发生,而低优先级的任务稍后发生;或者你真的想要不同优先级的线程?

于 2009-02-14T00:36:46.127 回答
2

绝对是一个可怕的想法。

一般来说,设置线程或进程优先级是一个坏主意,因为它是不确定的,并且您可能会饿死该行为中的其他线程/进程。此外,由于饥饿,您实际上可能会提升较低优先级线程/进程的优先级。

最重要的是,线程池的线程旨在被重用,并且通过更改线程的优先级,您正在更改将在例程运行后获取线程以供使用的任务的期望。

话虽如此,您有两个选择。如果您只需要确定任务的优先级并且不介意与您的任务无关的其他项目是否在您之前执行,那么您可以将线程池​​与生产者消费者模式一起使用,并使用一些包装器代码来获取最高优先级项目从您的队列中。

如果您希望线程只运行您的任务,那么您必须创建自己的线程池(使用 System.Thread 类),然后做同样的事情,使用包装代码让任务根据优先级执行。

.NET 4.0(尚未发布)中 System.Threading 命名空间中的新类将为您处理创建单独的线程池。

于 2009-02-14T00:39:00.147 回答
0

我认为要干净,当您退出该方法时,您还应该恢复线程优先级!(使用 try ... finally 或类似的东西)

于 2009-02-14T00:26:17.200 回答