我在尝试测试 TPL 时遇到了一个简单的问题。我想在控制台窗口中获取数字(从 1 到 1000)。
这是我的代码:
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(Calculate).ContinueWith(task =>
{
Task.WaitAll();
Console.ReadKey();
});
}
private static void Calculate()
{
for (var number = 0; number < 1000; number++)
{
Console.WriteLine(number);
}
}
}
问题是窗口只是关闭并且没有显示任何内容。我知道我在ContinueWith 方法中搞砸了一些事情。我怀疑ContinueWith没有被执行(因为窗口在没有我输入的情况下就关闭了),但我不知道为什么。
任何建议都有帮助(尝试阅读 MSDN 但无济于事)。预先感谢。
Continuation 异步运行。如果你做一个小测试:
public static void Main(string[] args)
{
Task.Factory.StartNew(Calculate).ContinueWith(task =>
{
Console.WriteLine("Finished!");
});
Console.WriteLine("Press ENTER to close...");
Console.ReadLine();
}
你会看到的
按 ENTER 关闭...
1
2
3
...
999
完成了!
因为延续不会阻塞。
如果你想阻塞主执行线程等待任务,你可以这样做:
var task = Task.Factory.StartNew(Calculate);
task.Wait();
它会阻塞
Wait
。
您必须观察到,Task 类内部使用线程池中的线程,这意味着该线程是后台线程,一旦前台线程终止,后台线程就会终止,并且 main 方法使用默认为前台线程的主线程,因此你必须添加
Console.ReadKey()
来保存你的程序,直到后台线程结束。