首页 新闻 会员 周边

c# 中 Task.ContinueWith 的疑问

0
[已解决问题] 解决于 2019-04-25 17:33

最近看到了c# 中 Task.ContinueWith的用法,有一些疑问。
如果我有两个异步的方法func1 和 func2, func2需要func1的执行结果作为参数,下面这两种写法的区别是什么呢?

var result = await func1();
await func2(result);

----------------------------分割线-----------------------------------------------------------------------------------

func1().ContinueWith(
result = > {
func2(result.Result);
}
);

或者说Task.ContinueWith的作用场景是什么样的呢?

DogTwo的主页 DogTwo | 菜鸟二级 | 园豆:202
提问于:2019-04-25 17:12
< >
分享
最佳答案
0

写法不一样而已,就像你用new 关键字和用函数。
前者还需要要求函数本身为异步,后者不需要,Task本身就是异步,
后者写匿名函数更简洁方便。

奖励园豆:5
花飘水流兮 | 专家六级 |园豆:13567 | 2019-04-25 17:17

嗯嗯 明白了 谢谢您

DogTwo | 园豆:202 (菜鸟二级) | 2019-04-25 17:29
其他回答(2)
0

Task.ContinueWith有些参数很好用,比如可以设定只有任务执行失败了才执行,只有任务成功了才执行等

会长 | 园豆:12407 (专家六级) | 2019-04-25 17:28

谢谢

支持(0) 反对(0) DogTwo | 园豆:202 (菜鸟二级) | 2019-04-25 17:29

如果有三个任务t1,t2,t3,
t2=t1.ContinueWith(巴拉巴拉,TaskContinuationOptions.OnlyOnRanToCompletion);
t3=t1.ContinueWith(嘟啦嘟啦,TaskContinuationOptions.NotOnRanToCompletion);
我的问题是:
我下面想这样
await WhenAll(t1,t2,t3);
但是这样会报错,如果t1执行没成功,直接whenAll的时候就报错了。我不想让他报错,请问怎么搞才能让三个都执行完再接着往下执行。也就是:不管t1成功不成功,都要后面的t2或者t3中对应的一个执行完再往下执行。

支持(0) 反对(0) 一吻不zhi | 园豆:200 (初学一级) | 2022-02-19 17:17

@一吻不zhi:
这样可以不:

try
{
    Task.WaitAll(t1,t2,t3);
}
catch{}
// code some here

支持(0) 反对(0) 会长 | 园豆:12407 (专家六级) | 2022-02-21 08:58
0

1:你示例代码中的fun1和fund2的执行顺序在这两种写法中的执行顺序没有区别;
2:需要注意的是:第一种写法,在调用线程中是等待的。而第二种写法中,调用线程(即你当前编码的main线程)则是不等待func1 func2的执行的。
3:Task.ContinueWith的应用场景就像字面自已那样:前一个任务执行后你想继续做的任务用continue,实际就是等待;同时还可以设置某些条件下才真正执行continue

万德福儿 | 园豆:9 (初学一级) | 2019-05-02 09:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册