我有三个函数要调用 - void DoJob1()void DoJob2()和Cleanup()。 DoJob2()只应在DoJob()成功时运行。应始终调用清理。
我一直在努力使用以下方法:
Task theTask = new Task( () => DoJob1(), CancelTokenSource.Token );
theTask.ContinueWith( currTask => DoJob2(),
TaskContinuationOptions.OnlyOnRanToCompletion |
TaskContinuationOptions.AttachedToParent );
theTask.ContinueWith( currTask => Cleanup() );
DoJob2在DoJob1之后正确运行,但Cleanup与此同时运行。我可以看到为什么但是看不到任何简单的方法来阻止它并使其正确运行,即使两者都失败了?
答案 0 :(得分:1)
DoJob2在DoJob1之后正确运行,但Cleanup与此同时运行。
那是因为一旦theTask
(即运行DoJob1)成功,你就会告诉它继续。您可以将theTask
更改为指向DoJob2
的完成情况。
Task theTask = new Task( () => DoJob1(), CancelTokenSource.Token );
theTask = theTask.ContinueWith( currTask => DoJob2(),
TaskContinuationOptions.OnlyOnRanToCompletion |
TaskContinuationOptions.AttachedToParent );
theTask.ContinueWith( currTask => Cleanup() );
或者您可以使用内联语法:
Task theTask = new Task( () => DoJob1(), CancelTokenSource.Token )
.ContinueWith( currTask => DoJob2(),
TaskContinuationOptions.OnlyOnRanToCompletion |
TaskContinuationOptions.AttachedToParent )
.ContinueWith( currTask => Cleanup() );
如果可能,您还可以考虑使用async/await
语法:
try
{
await Task.Run(() => DoJob1());
await Task.Run(() => DoJob2());
}
finally
{
await Task.Run(() => CleanUp());
}
当然,从你给出的例子来看,很难理解你为什么要使用Task
,因为你似乎没有任何异步代码。也许你可以简化一些事情:
try
{
DoJob1();
DoJob2();
}
finally
{
CleanUp();
}