找回密码
 立即注册
搜索
查看: 1995|回复: 18

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

[复制链接]
     
发表于 2021-5-19 16:28 | 显示全部楼层 |阅读模式
本帖最后由 独自旅行 于 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();
}
的设计是万万不可的,不然的话看上去就好像任务完成了一样,还不知道哪个环节出了问题。

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

使用道具 举报

     
发表于 2021-5-19 16:34 来自手机 | 显示全部楼层
这个吗?
回复

使用道具 举报

     
发表于 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 | 显示全部楼层
哎呀?
我刚刚发现我其实只是要一个同步流程啊?
那我是不是搞错方向了?
回复

使用道具 举报

     
发表于 2021-5-19 17:00 来自手机 | 显示全部楼层
怎么听着这么像消息队列做的事,一个订单,然后出错后回滚。不过,如果只是单机的,不是分布式的,那不就是你自己说的同步流程,然后写好callback就行了
回复

使用道具 举报

发表于 2021-5-19 17:21 | 显示全部楼层
同步的话顺序写就行了,外面包个try catch
回复

使用道具 举报

     
发表于 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
回复

使用道具 举报

     
发表于 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的必要。 ...

因为博文上面没写。
输出日志不是不行,不过我设想的是中止流程跳信息窗报告。
因为程序的目标不是很复杂,功能单一。
但是中间几个步骤下来,如果出错就会影响后续。
所以就算是单一,也还是要做好中止对策。
哪怕只是减轻日常重复任务的脚本小子。
回复

使用道具 举报

     
发表于 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},

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

使用道具 举报

头像被屏蔽
     
发表于 2021-5-20 15:48 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-14 05:13 , Processed in 0.122682 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表