任务忽略了Thread.Sleep

时间:2010-10-29 09:19:12

标签: c#-4.0 task task-parallel-library

试图掌握TPL。

为了好玩,我尝试用随机睡眠创建一些任务来查看它是如何处理的。我瞄准火灾并忘记模式......

static void Main(string[] args)
    {
        Console.WriteLine("Demonstrating a successful transaction");

        Random d = new Random();
        for (int i = 0; i < 10; i++)
        {
            var sleep = d.Next(100, 2000);


            Action<int> succes = (int x) =>
            {
                Thread.Sleep(x);
                Console.WriteLine("sleep={2}, Task={0}, Thread={1}: Begin successful transaction",
                   Task.CurrentId, Thread.CurrentThread.ManagedThreadId, x);
            };

            Task t1 = Task.Factory.StartNew(() => succes(sleep));
        }
        Console.ReadLine();
    }

但我不明白为什么它会向控制台输出所有行而忽略睡眠(随机)

有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:6)

重要的:

TPL默认的TaskScheduler不保证每个任务的线程 - 一个线程可用于处理多个任务。

调用Thread.Sleep可能会影响其他任务的性能。

您可以使用 TaskCreationOptions.LongRunning 提示构建任务,这样TaskScheduler将为任务分配一个专用线程,并且可以安全地阻止该任务。

答案 1 :(得分:2)

您的代码使用 i 的值而不是生成的随机数。它不会忽略睡眠,而是每次迭代在0到10ms之间休眠。

尝试:

Thread.Sleep(sleep);

答案 2 :(得分:0)

句子

  

任务t1 = Task.Factory.StartNew(()=&gt; succes(sleep));

将创建任务并自动启动它,然后将在for内部再次迭代,而无需等待任务结束其进程。因此,当创建并执行第二个任务时,可以完成第一个任务。我的意思是你不是在等待任务结束:

你应该试试

Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
t1.Wait();