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

C# 如果我在任务中执行延迟,为什么ContinueWith会执行,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,我对任务并行库中的ContinueWith似乎在做什么感到有点困惑 我的理解是,在任务完成之前不应该调用此函数。如果我在一个真正的循环中,这根本不应该被调用 DateTime t = DateTime.Now.AddSeconds(10); Task.Factory.StartNew(async () => { while (true) {

我对任务并行库中的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)) ;
当我点击第一个延迟时,它为什么调用ContinueWith?

您创建了一个邪恶的
异步void
委托

同步部分一完成,它就完成(完成原始的
任务)

无法观察原始委托的异步部分

原始委托返回一个异步
任务
,表示操作的异步部分。
但是,外部
任务
会在同步部分完成后立即完成,您永远不会等待内部
任务
完成

相反,您应该调用
Task.Run()
,它接受
Func

这样,原始委托的异步部分将有助于原始任务。

您创建了一个邪恶的
异步void
委托

同步部分一完成,它就完成(完成原始的
任务)

无法观察原始委托的异步部分

原始委托返回一个异步
任务
,表示操作的异步部分。
但是,外部
任务
会在同步部分完成后立即完成,您永远不会等待内部
任务
完成

相反,您应该调用
Task.Run()
,它接受
Func


这样,原始委托的异步部分将有助于原始任务。

task.Factory.StartNew
返回的任务是
任务,因为lambda返回
任务,并且lambda在线程池上运行。lambda的结果被包装在
任务
中,并放入其
结果
属性中


因此,您需要调用
Unwrap
或更好地使用
Task.Run

Task.Factory.StartNew
返回的任务是
Task
,因为lambda返回
任务,并且lambda在线程池上运行。lambda的结果被包装在
任务
中,并放入其
结果
属性中


因此,您需要调用
Unwrap
或更好地使用
任务。从上一次调用返回
任务时,应调用Run
ContinueWith
任务在前一次调用完成之前返回


编辑:事实上,SLaks已经发现了真正的问题。我的陈述仍然是正确的,尽管在这个例子中不太相关。:)

ContinueWith
应在从上一次调用返回任务时调用。
任务在前一次调用完成之前返回


编辑:事实上,SLaks已经发现了真正的问题。我的陈述仍然是正确的,尽管在这个例子中不太相关。:)

有没有更好的方法可以让我在任务中使用wait?你为什么在任务中等待?@LukeMcGregor:是的;使用
Task.Run()
。您也可以显式使用
Unwrap
。是否有更好的方法在任务内部使用wait?您为什么在任务内部等待?@LukeMcGregor:Yes;使用
Task.Run()
。也可以显式使用
Unwrap
looped
Continued with: WaitingForActivation
looped
looped
looped
looped
looped
looped
looped
looped
looped