任务忽略了Thread.Sleep

4

我试图理解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();
    }

但是我不明白为什么它会忽略Sleep(random)并将所有行输出到控制台。

有人能解释一下吗?

3个回答

7

重要提示:

TPL默认的TaskScheduler不能保证每个任务都有一个线程——一个线程可以用于处理多个任务。

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

您可以使用TaskCreationOptions.LongRunning提示构建您的任务,这样TaskScheduler将为任务分配一个专用线程,并且在其上阻塞是安全的。


2

您的代码使用了变量 i 的值,而不是生成的随机数。它不会忽略 sleep 函数,而是每次迭代都会在 0 到 10 毫秒之间进行休眠。

建议修改为:

Thread.Sleep(sleep);

只是一个打字错误,已经编辑了原始代码。问题仍然是一样的! - Janus007

0

这句话

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

将创建一个任务并自动启动它,然后将再次在 for 循环内迭代,而不等待任务结束其过程。因此,当创建并执行第二个任务时,第一个任务可能已经完成。我的意思是你没有等待任务结束:

你应该尝试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接