ThreadPool.QueueUserWorkItem - 订单未保存?

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)

该名称表明订单已保留.

有没有办法确保订单得到保留?
如果没有,您建议采用哪种替代实施方案?

Pet*_*man 5

没有办法保留订单.线程池的目的是并行执行独立的任务.从本质上讲,这些任务的开始和结束顺序是高度不确定的.如果您需要子任务以特定顺序开始和结束,那么您无法并行化它们.

private static void Main()
{
    for (var i = 0; i < 10; ++i)
        Console.Write(i + " ");

    Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

为了澄清:线程池队列中的任务顺序被保留,但它们实际执行的顺序是不确定的.


Wes*_*and 5

如果你想的任务以串行,但在不同的线程比调用线程中运行,那么你应该看看EventLoopScheduler无扩展。它允许您计划特定工作线程上的工作单元。