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

时间:2009-02-14 00:22:44

标签: c# .net multithreading asynchronous threadpool

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

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

答案 0 :(得分:4)

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

  

何时不使用线程池线程

     

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

     
      
  • 您需要一个前台线程。

  •   
  • 您需要一个具有特定优先级的主题。

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

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

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

  •   

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

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

答案 1 :(得分:1)

绝对 可怕的主意。

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

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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