C# 如何正确使用Task.ContinueWith?
我在尝试测试TPL时遇到了一个简单的问题。例如,我想在控制台窗口中获取数字(从1到1000) 这是我的代码:C# 如何正确使用Task.ContinueWith?,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我在尝试测试TPL时遇到了一个简单的问题。例如,我想在控制台窗口中获取数字(从1到1000) 这是我的代码: class Program { static void Main(string[] args) { Task.Factory.StartNew(Calculate).ContinueWith(task => {
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);
}
}
}
类程序
{
静态void Main(字符串[]参数)
{
Task.Factory.StartNew(计算).ContinueWith(任务=>
{
Task.WaitAll();
Console.ReadKey();
});
}
私有静态void计算()
{
对于(变量编号=0;编号<1000;编号++)
{
控制台写入线(编号);
}
}
}
问题是窗口只是关闭,没有显示任何内容。我知道我用这种方法把事情搞砸了。我怀疑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键关闭
一,
二,
三,
999
完了
因为延续不会阻塞
如果要阻止主执行线程等待任务,可以执行以下操作:
var task = Task.Factory.StartNew(Calculate);
task.Wait();
它将阻塞
等待
,启动新线程
不创建新线程吗?因为主线程将继续并退出应用程序。在你的后台工作完成之前,是否应该编写一些代码来保存主线程?我一直认为StartNew会启动一项任务。引用MSDN:“创建并启动任务。”链接本身:它是TPL(任务并行库)的一部分,所以我猜它仍然依赖于水下线程。在主方法退出之前,是否尝试添加Console.ReadLine?从未尝试过使用TPL,但我最好的猜测是,您的应用程序刚刚退出,其余的实现都很好,医生说得通:)。在单元测试中尝试了它。他的解决方案works@bas是正确的;任务是在一个新线程上异步启动的,该线程的存在并不能阻止控制从Main的末尾脱落并终止进程。。。我也应该深入研究这件事:)+1、快速回答@bas是的,他们有:)我真的,真的很喜欢TPL,尤其是与.NET4.5中的async
&wait
搭配使用时。还有第三方物流数据流…谢谢。现在我明白了这背后的基本思想。:)