CancellationScope 提供工作流中優雅處理取消邏輯的機制,包含正常執行路徑與取消處理常式。本文說明其在例外處理與 Parallel 並行容器中的應用。
| 屬性 | 類型 | 說明 |
|---|---|---|
| Body | Activity | 正常執行路徑 |
| CancellationHandler | Activity | 取消時執行的清理邏輯 |
| Variables | Collection<Variable> | 容器內部變數 |

public sealed class ExceptionActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
int v = 1 - 1;
double i = 1 / v; // DivideByZeroException
}
}
在 CancellationScope.Body 中放入 ExceptionActivity,CancellationHandler 放入 WriteLine 列印「取消處理」。

static UnhandledExceptionAction unhandledException_Cancel(WorkflowApplicationUnhandledExceptionEventArgs e)
{
Console.WriteLine("unhandledException_Cancel:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel; // 關鍵:回傳 Cancel
}
ExceptionActivity 拋出例外OnUnhandledException 回傳 CancelCancellationScope.CancellationHandlerCanceled,觸發 Completed 事件
Parallel 並行執行多個分支,配合 CompletionCondition 可在滿足條件時提前結束。搭配 CancellationScope 可確保被取消的分支執行清理邏輯。
myVariable=falseParallel.CompletionCondition = myVariableDelay 15s → 列印 "A" → myVariable=true,CancelHandler 列印 "Cancellation:A取消"Delay 10s → 列印 "B" → myVariable=true,CancelHandler 列印 "Cancellation:B取消"
分支 B 先完成(10 秒),設定變數為 true,Parallel 條件滿足結束。分支 A 尚在等待中被取消,執行其 CancelHandler。
輸出順序:B1 → B2 → Cancellation:A取消
