我需要以不同的优先级异步调用几个方法。
我的第一个想法是使用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
}
这有用还是你推荐什么?
答案 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是一个旧的但非常详细的自定义线程池实现,支持不同的优先级。