V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderfox
V2EX  ›  .NET

是否有序列性工作库?

  •  
  •   coderfox · 2017-03-11 22:02:58 +08:00 · 2859 次点击
    这是一个创建于 2574 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我也不是很清楚这个应该叫什么。

    需求是:客户端有一些函数,共同作用用来完成一项操作,我希望能有库来校验执行状态和保存过去的执行结果。

    例子:
    为完成用户注册操作,我需要:
    ①设置昵称;
    ②获取 TOS ;
    ③同意 TOS 。共计三步。
    每一步都依赖于前面每一步的执行(甚至执行结果),在执行③时需要用户输入,但我做的是 API 的 SDK 。

    是否有这样的库能够检查和管理工作序列?
    谢谢。
    16 条回复    2017-03-20 12:27:09 +08:00
    jimzhong
        1
    jimzhong  
       2017-03-11 22:14:08 +08:00
    我也想知道是否有。
    leeg810312
        2
    leeg810312  
       2017-03-11 23:10:39 +08:00 via Android
    我理解正确的话, lz 是要一个工作流引擎,可以监控每个流程节点的状态,控制流程的流转,自然也能保存每一次流程执行的情况
    tramedy
        3
    tramedy  
       2017-03-11 23:33:34 +08:00
    我司内部是用有些业务使用 Rule Engine 来实现类似的规则,还有些地方也用到了 RxJava 中的 Observable 等
    可以看看
    akira
        4
    akira  
       2017-03-12 01:19:33 +08:00
    看看状态机的东西符合你需求不
    wohenyingyu02
        5
    wohenyingyu02  
       2017-03-12 01:39:01 +08:00
    扫了一眼标题就看到“性工作”三个字是不是撸多了
    coderfox
        6
    coderfox  
    OP
       2017-03-12 08:20:42 +08:00 via Android
    @jimzhong @leeg810312 @tramedy @akira
    谢谢!
    看了一下,这些和需求都不太接近,但可以参考,决定还是自己造轮子了。

    主要是流程上没法实现语义化,只能简单地 continue ,做 SDK 的话不太友好。
    例如:
    Workflow reg = client.getRegWorkflow();
    reg.setNickname("sth");
    var tos = reg.getTos("sth");
    if( tos ...... ) reg.acceptTos(reg.getResult(reg.steps.GET_TOS).tosId);

    如果这些技术能的话,还望不吝赐教。
    owt5008137
        7
    owt5008137  
       2017-03-12 14:55:16 +08:00 via Android
    你说的是 Task ?
    coderfox
        8
    coderfox  
    OP
       2017-03-12 14:58:54 +08:00 via Android
    @owt5008137
    我需要把这种关系描述好,返回给调用 SDK 的程序,并且需要语义和非异步支持。
    现在看到的解决方案似乎都是针对应用程序而非类库的。
    我觉得似乎 Task 并不能满足我的需求。如能应用,望不吝赐教。
    owt5008137
        9
    owt5008137  
       2017-03-12 16:48:55 +08:00 via Android
    @coderfox 按我的理解,上面的三个步骤应该就是 3 个 Task 连起来呀
    coderfox
        10
    coderfox  
    OP
       2017-03-12 16:57:04 +08:00 via Android
    @owt5008137 过程中还需要用户输入,所以不能把 Task 连起来返回。
    owt5008137
        11
    owt5008137  
       2017-03-12 22:06:23 +08:00 via Android
    @coderfox 需要输入的时候不能挂起 Task 然后等结束了再恢复么。本来 Task 也不是为同步行为设计的
    coderfox
        12
    coderfox  
    OP
       2017-03-12 22:25:58 +08:00 via Android
    @owt5008137 在这个过程里还能传递参数进去?
    leeg810312
        13
    leeg810312  
       2017-03-13 01:17:02 +08:00 via Android
    有用户输入的流程控制我觉得需要用专门的工作流引擎,至于语意处理,可以引入类似 lua 的嵌入式脚本,或自己实现一个简单的脚本解析器,包装为 sdk ,供程序调用控制流程
    owt5008137
        14
    owt5008137  
       2017-03-13 08:11:58 +08:00 via Android
    @coderfox 我对.net 并不是特别熟,不过在典型的应用场景中不是等待 IO 然后处理恢复 Task 这种流程吗?这种流程肯定要根据 IO 的内容或者执行结果来再做处理的,所以肯定是能传数据进来吧
    coderfox
        15
    coderfox  
    OP
       2017-03-13 22:04:52 +08:00 via Android
    @owt5008137
    谢谢回答,但是因为我做的是 SDK ,我这里等待的传入参数不是来自用户输入,不能用类似 await Console.ReadLine() 的方案。
    总之谢谢了。
    noli
        16
    noli  
       2017-03-20 12:27:09 +08:00
    需求说得不够明确。虽然你认为不是 Task ,但根据我的理解,你需要的只是一个能够把 continuation 按照顺序执行的方式写出来的库。就算不是 Task 那也是跟他很相近的东西。可以考虑基于,如果 C++用 boost::coroutine ,如果 C# 用 Task 等等来做进一步封装成你需要的东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5411 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 07:36 · PVG 15:36 · LAX 00:36 · JFK 03:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.