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();
    }

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

有人可以向我解释吗?

4

3 回答 3

7

重要的:

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

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

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

于 2011-12-29T15:50:12.207 回答
2

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

尝试:

Thread.Sleep(sleep);
于 2010-10-29T09:23:45.647 回答
0

这句话

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

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

你应该试试

Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
t1.Wait();
于 2011-09-29T15:16:23.070 回答