如果我在任务中做了延迟,为什么ContinueWith会执行

Not*_*ple 1 c# task-parallel-library async-await

我对任务并行库中的ContinueWith似乎有点困惑.

我的理解是,在任务完成之前不应该调用它.如果我在一个真正的循环中,这根本不应该被调用.

        DateTime t = DateTime.Now.AddSeconds(10);
        Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    if (t < DateTime.Now)  //after 10s throw
                    { 
                        throw new Exception(); //I expect it to run the continuation here
                    }

                    Console.WriteLine("looped");
                    await Task.Delay(new TimeSpan(0, 0, 1));
                }
            }
        ).ContinueWith(ct => Console.WriteLine("Continued with: {0}",ct.Result.Status)) ;
Run Code Online (Sandbox Code Playgroud)

我希望以下代码不会运行ContinueWith方法,直到抛出异常,但事实并非如此.相反,我得到以下输出:

looped
Continued with: WaitingForActivation
looped
looped
looped
looped
looped
looped
looped
looped
looped
Run Code Online (Sandbox Code Playgroud)

为什么在我遇到第一次延迟时会调用ContinueWith?

usr*_*usr 6

这是从返回的任务,Task.Factory.StartNewTask<Task>因为你的拉姆达返回Task和拉姆达的线程池运行.lambda的结果包含在a中Task<T>并放入其Result属性中.

所以你需要打电话Unwrap或更好地使用Task.Run.