我刚刚注意到通过 ThreadPool.QueueUserWorkItem
排队的回调顺序不是确定性的,它肯定不是回调传入的顺序。
这可以用下面的简单程序来验证:
private static void Main()
{
for (var i = 0; i < 10; ++i)
ThreadPool.QueueUserWorkItem(Console.Write, i + " ");
Thread.Sleep(1000);
}
一次运行的输出是:
0 3 8 9 1 2 5 4 6 7
顾名思义,顺序是保留的。
有没有办法确保顺序被保留?
如果不是,您建议采用哪种替代实现方式?
最佳答案
如果您希望任务串行运行但在与调用线程不同的线程上,那么您应该查看 EventLoopScheduler在Reactive Extensions .它允许您在特定工作线程上安排工作单元。
关于c# - ThreadPool.QueueUserWorkItem - 订单未保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14505929/