Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确使用Task.ContinueWith?_C#_.net_Task Parallel Library - Fatal编程技术网

C# 如何正确使用Task.ContinueWith?

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 => {

我在尝试测试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);
        }
    }
}
类程序
{
静态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
搭配使用时。还有第三方物流数据流…谢谢。现在我明白了这背后的基本思想。:)