任务不等待ContinueWith完成
我有控制台应用程序和代码如下,
我的问题是在ContinueWith任务完成之前,控制台应用程序结束,它没有等待continueWith完成,请指教。
请让我知道我遗漏或错误。
var task1 = Task.Factory.StartNew(() => DoProcess()); task1 .ContinueWith( t1 => updateSuccess(), TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.ExecuteSynchronously); task1 .ContinueWith( t => updateFault(), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); task1.Wait();
您必须等待任务从主线程完成。 简化它看起来像
var task1 = Task.Factory.StartNew(() => DoProcess()); successContinuation = task1 .ContinueWith(t1 => updateSuccess(), TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.ExecuteSynchronously) failureContinuation = task1 .ContinueWith( t => updateFault(), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); Task.WaitAny(successContinuation, failureContinuation);
我认为你没有意识到你正在创建一个任务(实际上只是可能)在不同的线程中执行。 在您开始任务的那一刻,您将有两个不同的执行线程,主线程将继续运行,以及您的任务。 如果您希望主线程(控制台应用程序)等待任务完成,则必须手动指定它。
抛出exception时,Jorge的解决方案无效:
var task = new Task(() => { Console.WriteLine("My task..."); throw new Exception(); }); task.Start(); var taskNotOnFaulted = task.ContinueWith(t => { Thread.Sleep(1000); Console.WriteLine("NotOnFaulted"); }, TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.ExecuteSynchronously); var taskOnlyOnFaulted = task.ContinueWith(t => { Thread.Sleep(1000); Console.Write("OnlyOnFaulted"); }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); Task.WaitAny(taskNotOnFaulted, taskOnlyOnFaulted); Console.WriteLine("Finished");
输出是:
My task... Finished OnlyOnFaulted
这是因为taskNotOnFaulted在抛出exception时获得Canceled状态,而在没有抛出exception时它保持WaitingForActivation状态。
所以你必须更换:
Task.WaitAny(taskNotOnFaulted, taskOnlyOnFaulted);
通过
if (task.IsFaulted) taskOnlyOnFaulted.Wait(); else taskNotOnFaulted.Wait();