如何以某种优先级调用方法异步?

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

我的第一个想法是使用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 } 

这有用吗或你推荐什么?

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

何时不使用线程池线程

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

  • 您需要前台线程。

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

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

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

  • 您需要具有与线程关联的稳定标识,或者将线程专用于任务。

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

问题:你想要实现什么?你有一组要处理的任务,你希望先发生高优先级的任务,然后再发生较低的任务; 或者你真的想要不同优先级的线程吗?

绝对是一个可怕的想法。

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

最重要的是,线程池的线程意味着可以重用,并且通过更改线程的优先级,您将更改将在例程运行后获取线程的任务的期望。

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

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

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

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

这是一个旧的但非常详细的自定义线程池实现,支持不同的优先级。