我是并行编程的新手。我写下面的基本代码,但它总是在我除外的情况下运行。
Console.WriteLine ("Start");
Task task = Task.Factory.StartNew(() => {
for (int i = 0; i < 5; i++)
{
Console.WriteLine (i);
}
});
Console.WriteLine ("End");
在10次试验中,我通常无法获得8-9循环的结果。有时它打印循环结果,有时不打印。但我总是打印Start
和End
。发生在后面的是什么?为什么有时候我不能不时得到循环的结果?
提前致谢,
答案 0 :(得分:3)
您的程序在并行循环有机会打印任何输出之前终止。
Console.WriteLine ("Start");
Task task = Task.Factory.StartNew(() => {
for (int i = 0; i < 5; i++)
{
Console.WriteLine (i);
}
});
Console.ReadLine();
Console.WriteLine("End");
等待输入暂停,你会看到循环正确运行。
答案 1 :(得分:1)
在最后添加一条readline。您将看到以下内容:
Start
End
0
1
2
3
4
Console.WriteLine("Start");
Task task = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
});
Console.WriteLine("End");
Console.ReadLine();
答案 2 :(得分:1)
您必须告诉主线程等到任务结束。
在执行任务线程之前,大多数情况下都会打印“结束”。使用TaskContinuationOptions
告诉父线程等待其任务线程完成。
Console.WriteLine ("Start");
Task task = Task.Factory.StartNew(() => {
for (int i = 0; i < 5; i++)
{
Console.WriteLine (i);
}
});
task.ContinueWith(ant =>
{
Console.WriteLine("End");
}, TaskContinuationOptions.NotOnFaulted| TaskContinuationOptions.AttachedToParent);
task.Wait();