最近看到了c# 中 Task.ContinueWith的用法,有一些疑问。
如果我有两个异步的方法func1 和 func2, func2需要func1的执行结果作为参数,下面这两种写法的区别是什么呢?
var result = await func1();
await func2(result);
----------------------------分割线-----------------------------------------------------------------------------------
func1().ContinueWith(
result = > {
func2(result.Result);
}
);
或者说Task.ContinueWith的作用场景是什么样的呢?
写法不一样而已,就像你用new 关键字和用函数。
前者还需要要求函数本身为异步,后者不需要,Task本身就是异步,
后者写匿名函数更简洁方便。
嗯嗯 明白了 谢谢您
Task.ContinueWith有些参数很好用,比如可以设定只有任务执行失败了才执行,只有任务成功了才执行等
谢谢
如果有三个任务t1,t2,t3,
t2=t1.ContinueWith(巴拉巴拉,TaskContinuationOptions.OnlyOnRanToCompletion);
t3=t1.ContinueWith(嘟啦嘟啦,TaskContinuationOptions.NotOnRanToCompletion);
我的问题是:
我下面想这样
await WhenAll(t1,t2,t3);
但是这样会报错,如果t1执行没成功,直接whenAll的时候就报错了。我不想让他报错,请问怎么搞才能让三个都执行完再接着往下执行。也就是:不管t1成功不成功,都要后面的t2或者t3中对应的一个执行完再往下执行。
@一吻不zhi:
这样可以不:
try
{
Task.WaitAll(t1,t2,t3);
}
catch{}
// code some here
1:你示例代码中的fun1和fund2的执行顺序在这两种写法中的执行顺序没有区别;
2:需要注意的是:第一种写法,在调用线程中是等待的。而第二种写法中,调用线程(即你当前编码的main线程)则是不等待func1 func2的执行的。
3:Task.ContinueWith的应用场景就像字面自已那样:前一个任务执行后你想继续做的任务用continue,实际就是等待;同时还可以设置某些条件下才真正执行continue