簡體   English   中英

C#以編程方式從代碼活動WF 4.0內部終止工作流

[英]C# Terminate a Workflow Programatically from inside Code Activity WF 4.0

我在Windows Workflow Foundation Service中托管了一個代碼Activity ,我希望根據我從數據庫中檢查的一些值來終止工作流。 我不想使用Throw Exception方法,我需要從“Code Activity”代碼中進行,而不是從設計器中進行 我仍然是WWF的初學者,我嘗試了以下方法,即創建工作流應用程序,並在代碼活動的當前實例上初始化它,但它不起作用。 我需要首先捕獲當前活動實例的父工作流應用程序 ,然后調用Terminate方法。

   WorkflowApplication wfApp = new WorkflowApplication(this);
   wfApp.Terminate("The following workflow is terminating");

感謝您的幫助

要正常終止,只需使用TerminateWorkflow作為子活動。 這將調用WorkflowApplication.Completed操作。

public class CanceledActivity : NativeActivity
{
    private readonly TerminateWorkflow terminateWorkflow = new TerminateWorkflow
        {
            Reason = "Reason why I'm terminating!"
        };

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddImplementationChild(terminateWorkflow);
    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(terminateWorkflow);
    }
}

或者您可以拋出異常,但這將調用WorkflowApplication.OnUnhandledException

public class CanceledActivity : NativeActivity
{
    protected override void Execute(NativeActivityContext context)
    {
        throw new Exception("this will not gracefully terminate the workflow")
    }
}

還有很多其他的方法,也取決於你想做什么以及什么時候你想做。 請記住,由於其異步性,工作流只會在可能的情況下終止。

您可以將WorkflowApplication放入應用程序上下文擴展中,然后通過ActivityContext類可以使用它們。

// Add the application to it's own context
_workflowApplication.Extensions.Add(_workflowApplication);

// Access the application in your activity
var application = context.GetExtension<WorkflowApplication>();
application.BeginTerminate(new WorkflowException(error), null, null);

在我看來,實際上你在目前想要使用的一個活動中有兩個活動。 流程圖(即Visio)中不可能要求的是因為一個活動只有一個可以鏈接到下一個活動的退出(即結束狀態),您需要一個決策塊才能獲取不同的路線。

這是您嘗試轉換為流程圖的示例:

public int CalculatePrice(string parameters)
{
    // Calculate result.
    var price = 5;

    // Are we done?
    if (!IsVATNeeded(price))
    {
        return price;
    }

    // Do more calculations.
    price = price * vat;

    return price;
}

從方法體內返回的是代碼氣味,指出需要重新思考工作流程。 健康的方法只有一個回報。

public int CalculatePrice(string parameters)
{
    var price = CalculatePriceWithoutVAT(parameters);

    if (IsVATNeeded(parameters))
    {
        price = ApplyVAT(price);
    }

    return price;
}

現在,第二種方法可以直接轉換為流程圖/工作流程。 在此輸入圖像描述

如果您有不同的情況,請提供示例流程圖或其他圖表。 經驗法則是,如果您無法繪制流程圖,狀態機或序列圖,則無法使用Microsoft Workflow實現它。

請注意,可以創建由其他活動組成的創建活動,以便您可以將上圖中的活動嵌入到單個活動中並隱藏詳細信息。 它與代碼示例中的CalculatePrice方法相同。 調用者實際上不必知道如何計算價格。

你可以這樣做:

throw new System.Activities.Statements.WorkflowTerminatedException("reason string");

從您的代碼中的任何位置,並完成它:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM