2009-02-14 57 views
0

我需要以不同的优先级异步调用几个方法。如何以某种优先级调用异步方法?

我的第一个想法是使用线程池,并改变这样的线程的优先级:

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

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx,它不会,如果你的目标2.0工作,它暗示有是在3.5的一些差异,但并没有具体提到优先:

何时不使用线程池中的线程

有几种方案中,它是适当的创建和使用线程池中的线程管理自己的线程,而不是:

  • 你需要一个前台线程。

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

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

  • 您需要将线程放置到单线程单元中。所有ThreadPool线程都在多线程的公寓中。

  • 您需要拥有与该线程关联的稳定身份,或将线程专用于任务。

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

问题:如果你有一套要处理的任务,你希望高优先级的任务先发生,然后再发生较低的任务,那么你想达到什么目标?或者你真的想要不同优先级的线程?

0

我觉得很干净,你应该恢复线程优先级,当你退出该方法! (使用try ...最后或类似的东西)

1

这就是绝对是 a 可怕的想法。

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

最重要的是,线程池的线程是要重用的,并且通过改变线程的优先级,您正在改变任务的期望,以便在例程运行后让线程使用。

这就是说,你有两个选择。如果你只需要优先考虑你的任务,并不介意在你的任务之前是否执行了与你的任务无关的其他项目,那么你可以使用带有生产者消费者模式的线程池,以及一些包装器代码,从你的队列中。

如果你只想让线程运行你的任务,那么你必须创建你自己的线程池(使用System.Thread类),然后做同样的事情,使用包装代码来获得任务执行的基础上优先。

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

0

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