照理說一個無人值守的機器人原本是不應該有人工操作介入的,也就不會提供暫停功能。但客戶可能出於業務需要,或者風險管控的考慮,會需要機器人具備暫停功能。通常,會希望在機器人運行時,用戶摁下快捷鍵,機器人就馬上暫停,而暫停之后也能夠恢復。
那么如何在機器人執行正常業務流程的同時,檢測快捷鍵是否被摁下呢?這里可以使用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中實現暫停功能即可。