任务不等待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();