使用(不滥用)ContinueWith

Ric*_*bob 7 c# asynchronous task-parallel-library

假设我们有2个工作函数:

void Step1(); // Maybe long.
void Step2(); // Might be short clean up of step 1.
Run Code Online (Sandbox Code Playgroud)

我经常看到:

Task.Run(() => Step1()).ContinueWith(t => Step2());
Run Code Online (Sandbox Code Playgroud)

这创建了2个串行运行的任务.什么时候:

Task.Run(() => { Step1(); Step2(); });
Run Code Online (Sandbox Code Playgroud)

这将创建一个单独的任务运行于2个功能系列,看起来似乎是一个简单的选择.

是否有常识性指南可用于确定何时对更简单的方法进行延续是否需要延续?
上面的例子没有异常处理 - 异常处理对这些指导有何影响?

Yuv*_*kov 6

是否有常识性指南可用于确定何时对更简单的方法进行延续是否需要延续?

ContinueWith为您提供了调用的能力Step2只通过一定的条件TaskContinutationOptions,如OnlyOnCanceled OnlyOnFaulted,OnlyOnRanToCompletion等.这样,您就可以构建适合每种情况的工作流程.

您也可以使用单个Task.Run和a来执行此操作try-catch,但这可能更适合您维护.

就个人而言,我试图避免使用,ContinueWith因为我发现async-await不那么冗长,更像是同步.我宁愿await在里面try-catch.


Pat*_*man 1

ContinueWith即使第一个任务产生异常(检查t.Exception),也会运行。

AContinueWith可以看作是一个异步的finally语句try..catch。这正是它有用的原因。ContinueWith您也可以在调用时进行细粒度。