试图掌握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();
}
但我不明白为什么它会向控制台输出所有行而忽略睡眠(随机)
有人可以向我解释一下吗?
答案 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();