是否可以运行某些PLINQ AsParallel()-查询优先级比其他查询低的查询?
(或某些优先级高于其他优先级)
PLinq是否可以做到这一点,还是我必须避免使用PLINQ并自己完成所有工作?
编辑/更新:
可以打电话吗
Thread.Sleep(0)
我要归档较低优先级时在并行执行的方法内部?
还是这是一个非常糟糕的做法/黑客?
最佳答案
不幸的是,这在PLINQ中不是直接可能的。
您可以通过创建自定义TaskScheduler在大多数任务并行库的其余部分中执行此操作。使用Parallel.For
或ForEach
时,这将使您具有自定义的“优先级”。
但是,PLINQ没有提供自定义TaskScheduler的功能,因为PLINQ需要TaskScheduler的非常严格的保证,并且担心公开此问题将非常棘手。
这会“降低”优先级,但是不幸的是,这有其自身的问题,尤其是与PLINQ结合使用时。因为您将“休眠”在ThreadPool线程上,所以这可能会导致ThreadPool中的线程饥饿。
此外,这还存在一个基本问题-PLINQ的设计旨在处理查询,而不是为处理而设计的。引入逻辑代码来控制流结构确实与PLINQ背后的理论背道而驰,并且可能会引起意想不到的性能影响,尤其是在使用默认分区的情况下。
关于c# - 具有较低优先级的PLINQ AsParallel()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5197550/