C# 如何调用具有某种优先级的异步方法?

C# 如何调用具有某种优先级的异步方法?,c#,.net,multithreading,asynchronous,threadpool,C#,.net,Multithreading,Asynchronous,Threadpool,我需要以不同的优先级异步调用两个方法 我的第一个想法是使用线程池并更改线程的优先级,如下所示: static void Run() { ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod)); } static void SomeMethod(object o) { Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok? //

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

我的第一个想法是使用线程池并更改线程的优先级,如下所示:

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
}

这行得通吗?或者你有什么建议吗?

我认为,为了保持干净,你还应该在退出该方法时恢复线程优先级!(使用try…finally或类似的工具)

根据,如果您的目标是2.0,它将不起作用,它暗示3.5中存在一些差异,但没有特别提到优先级:

何时不使用线程池线程

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

  • 你需要一个前台线程

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

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

  • 您需要将线程放置到单线程单元中。所有线程池线程都在多线程单元中

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

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


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

这肯定是一个非常糟糕的想法

一般来说,设置线程或进程优先级是一个坏主意,因为它是不确定的,并且可能会耗尽其他线程/进程。此外,您实际上可能会因为饥饿而提高低优先级线程/进程的优先级

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

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

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

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