C# 如果我在任务中执行延迟,为什么ContinueWith会执行
我对任务并行库中的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) {
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