照理说一个无人值守的机器人原本是不应该有人工操作介入的,也就不会提供暂停功能。但客户可能出于业务需要,或者风险管控的考虑,会需要机器人具备暂停功能。通常,会希望在机器人运行时,用户摁下快捷键,机器人就马上暂停,而暂停之后也能够恢复。

那么如何在机器人执行正常业务流程的同时,检测快捷键是否被摁下呢?这里可以使用Pick(System.Activities.Statements.Pick)来实现这个效果。如下图如示。左侧只是用来模拟通常的业务流程,各位可以将自己实际的workflow放进去。右侧分支在Trigger中放入一个Monitor Events(UiPath.Core.Activities.MonitorEvents)用来同时检测快捷键是否触发。实际运行的时候,Pick的逻辑是这样的,两个分支的Trigger部分会并行执行(但其实各个分支的启动还是有细微的时间差的,这个在此先不讨论),哪一个分支的Trigger先运行完毕,就会运行那一个分支的Action部分并且其它分支会停止执行。

既然我们已经能够在主流程运行的同时检测快捷键是否触发,那么我们接下来要解决的问题就是如何暂停(阻塞)主流程的运行。这里要注意的一点是,用户暂停后,应该也能够取消暂停状态继续执行,所以这里采用的方法一定要能够接收用户的输入。对此,我在Monitor Events中利用了Message Box,当然读者也可以根据实际情况选择其它具有类似作用的Activity。Monitor Events中的内容大致如下所示。我们可以看到,当用户摁下Ctrl+P时,机器人就会暂停并且弹出对话框提示机器人已暂停,一旦用户点击确定按钮,机器人就会继续运行下去。

我在主流程中做了一个无限循环打印时间的设计用来模拟实际的业务流程。机器人运行中摁下Ctrl+P在Output窗口中看起来的效果就是如下图所示这样。

要特别注意的一点是Monitor Events的属性中有一个RepeatForever一定要设为True,否则机器人只能暂停一次。。。

另外,当一个Workflow通过Invoke Workflow File去调用另一个Workflow时,调用方和被调用方(简称父子workflow)其实是运行在两个线程中的,而Message Box只能暂停自己所处线程的执行,因此要特别处理。一般来说,子Workflow未运行完毕时,父Workflow并不会继续运行下去,所以在子Workflow中实现暂停功能即可。

最新文章

  1. SQL 存储过程 分页查询
  2. IOS开发--自定义segment控件,方便自定义样式
  3. Unity物理投射相关问题整理
  4. MongoDB 入门与实例
  5. (转)C#操作PPT
  6. ORM之PetaPoco错误--VS中NUGet程序包管理安装PetaPoco
  7. java线程(1)-线程同步
  8. 从零开始写一个Tomcat(叁)--请求解析
  9. Windows消息传递机制具体解释
  10. oracle数据泵之解决方案(用户)导入导出。
  11. 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)
  12. Jquery DataTables 使用AJAX POST的问题
  13. HDU6127Hard challenge
  14. Javascript-数值运算 保留小数点位数,并对最后一位小数各种取整方法
  15. String源码图
  16. dcoker实战,使用docker部署NodeJs应用
  17. 网络协议 18 - CDN:家门口的小卖铺
  18. java.lang.Enum
  19. 力扣(LeetCode)804. 唯一摩尔斯密码词
  20. 20155228 基于VirtualBox安装Ubuntu和学习linux命令的学习经历和心得

热门文章

  1. java对象深复制、浅复制(深拷贝、浅拷贝)的理解
  2. 外观模式facade
  3. java中的取整(/)和求余(%)
  4. python自定义库文件路径
  5. mvc上传图片
  6. Backbone.js 和 Nodejs 的一些共同点搞不清楚
  7. nodejs版本更新问题:express不是内部或外部命令
  8. Python set() 函数
  9. java集合之ArrayList,TreeSet和HashMap分析
  10. 建立CMenu菜单项,实现选中菜单项点击左键响应事件