Dan*_*rth 3 .net c# multithreading threadpool
我只是注意到排队的回调顺序ThreadPool.QueueUserWorkItem不是确定性的,它肯定不是回调传递的顺序.
这可以通过以下简单程序进行验证:
private static void Main()
{
for (var i = 0; i < 10; ++i)
ThreadPool.QueueUserWorkItem(Console.Write, i + " ");
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
一次运行的输出是:
0 3 8 9 1 2 5 4 6 7
Run Code Online (Sandbox Code Playgroud)
该名称表明订单已保留.
有没有办法确保订单得到保留?
如果没有,您建议采用哪种替代实施方案?
没有办法保留订单.线程池的目的是并行执行独立的任务.从本质上讲,这些任务的开始和结束顺序是高度不确定的.如果您需要子任务以特定顺序开始和结束,那么您无法并行化它们.
private static void Main()
{
for (var i = 0; i < 10; ++i)
Console.Write(i + " ");
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
为了澄清:线程池队列中的任务顺序被保留,但它们实际执行的顺序是不确定的.