独自旅行 发表于 2021-5-19 16:28

C#求助 如何按顺序进行任务(同时还能中止整个流程)?

本帖最后由 独自旅行 于 2021-5-19 16:33 编辑

我想做一个顺次进行环节步骤,但是中间附加有中止条件的设计。

比如说:环节1()—》环节2()—》环节3()—》……;
任一环节报错就让任务串中止。人工排查后手动重开任务串。

目前找到的方向是使用task类来实现。

但是还是有很多地方不明确。C#里面task这个类怎么用啊?
比如说任务之间是同时开始的,完全没有承接条件,不知道如何实现环节1》环节2》环节3……这样一个任务顺序流。
是使用Task.ContinueWith吗?网络博文说说它可以『在第一个Task完成后自动启动下一个Task,实现Task的延续』,有人用过吗?怎么用?

以及Task的取消该怎么做?

我看了一下博文,设想是使用task嵌套的方式,当某个值开关赋值之后启动task取消,取消父进程从而中止整个进程。

if(…………)
{
Application.Exit();
}
的设计是万万不可的,不然的话看上去就好像任务完成了一样,还不知道哪个环节出了问题。

不过,如果有更简单易行的设计方向,也请指教一下。多谢了。

hxdhttk 发表于 2021-5-19 16:34

这个吗?

hxdhttk 发表于 2021-5-19 16:35

https://mp.weixin.qq.com/s/TqrYj7CdafeAGjJMM13D7w

独自旅行 发表于 2021-5-19 16:39

hxdhttk 发表于 2021-5-19 16:35
https://mp.weixin.qq.com/s/TqrYj7CdafeAGjJMM13D7w

多谢指教。

独自旅行 发表于 2021-5-19 16:49

哎呀?
我刚刚发现我其实只是要一个同步流程啊?
那我是不是搞错方向了?

ryanz 发表于 2021-5-19 17:00

怎么听着这么像消息队列做的事,一个订单,然后出错后回滚。不过,如果只是单机的,不是分布式的,那不就是你自己说的同步流程,然后写好callback就行了

seducer0719 发表于 2021-5-19 17:21

同步的话顺序写就行了,外面包个try catch

EraserKing 发表于 2021-5-19 18:09

1 是的 用Continue With链式调用
2 使用带Cancellation Token的重载,注意Cancellation Token只是相当于flag,需要手动处理,不是Cancel就自动中止
3 Continuation Options.Not on Cancelled

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4.1

计算机组成原理 发表于 2021-5-19 18:14

7楼说得对,看你需求,跟Task根本不沾边,按顺序写就行了。

独自旅行 发表于 2021-5-19 20:01

seducer0719 发表于 2021-5-19 17:21
同步的话顺序写就行了,外面包个try catch

同步流程不知道怎么中间环节中止。

すぴぱら 发表于 2021-5-19 20:15

独自旅行 发表于 2021-5-19 20:45

すぴぱら 发表于 2021-5-19 20:15
task的意义不是要让异步更方便吗,你这个用不到异步其实,每个步骤判断一下得了 ...
try catch知道格式是什么,就是不知道如何搞一个可以中间中止的顺次流程。

美人希 发表于 2021-5-19 20:50

子方法抛检查异常外面catch住咯

— from OPPO PEGM00, Android 11 of S1 Next Goose v2.4.4.1

hourousha 发表于 2021-5-19 20:51

本帖最后由 hourousha 于 2021-5-19 20:57 编辑

首先,为何放着await语法糖不用去用ContinueWith?
其次,如果只是出错中止,那么完全没有使用task的必要。想知道在哪个环节出错,输出日志不就完了?
如果是窗口程序想保留界面响应,还想能通过界面能够随时停止。那可以考虑把每个环节写成async Task<int> Process_N(CancellationToken)形式。根据await 回来的 int判断成功与否,是否进行下一环节。

独自旅行 发表于 2021-5-19 20:59

hourousha 发表于 2021-5-19 20:51
首先,为何放着await语法糖不用去用ContinueWith?
其次,如果只是出错中止,那么完全没有使用task的必要。 ...
因为博文上面没写。
输出日志不是不行,不过我设想的是中止流程跳信息窗报告。
因为程序的目标不是很复杂,功能单一。
但是中间几个步骤下来,如果出错就会影响后续。
所以就算是单一,也还是要做好中止对策。
哪怕只是减轻日常重复任务的脚本小子。

hourousha 发表于 2021-5-19 21:05

独自旅行 发表于 2021-5-19 20:59
因为博文上面没写。
输出日志不是不行,不过我设想的是中止流程跳信息窗报告。
因为程序的目标不是 ...

那就可以像我上面说的。把每个环节写成一个async Task
可以预先定义一个类ResultCls,表示环节的执行结果,比如包含一个int的stat和string的msg
那么把环节给写成async Task<ResultCls> Process_N(CancellationToken token)形式
然后依次await各个环节,根据每次返回的ResultCls决定是继续执行还是显示弹出窗(窗口信息即ResultCls.msg)

すぴぱら 发表于 2021-5-19 21:59

独自旅行 发表于 2021-5-20 14:46

すぴぱら 发表于 2021-5-19 21:59
我甚至觉得都用不到async await这种现代语发糖,你按照java祖传的路线把callback全弄成interface...

写了个do循环暂时应付一下。
中间要验证错误的环节加个try{dosometing()}catch{return},

但是接下来就得开始学着使用队列了。

commanderyuri 发表于 2021-5-20 15:48

页: [1]
查看完整版本: C#求助 如何按顺序进行任务(同时还能中止整个流程)?