簡體   English   中英

wf 中關於 outArgument 的錯誤

[英]An error about outArgument in wf

當我使用書簽在活動中聲明OutArgument時出現以下錯誤!

“未提供所需活動參數‘Out-arg’的值”

這是我的代碼:

public string BookmarkName = "bookmark1 NameBookmark";        

[RequiredArgument]
public OutArgument<String> Out_arg { get; set; }

protected override void Execute(NativeActivityContext context)
{
    context.CreateBookmark(BookmarkName, new BookmarkCallback(OnBookmarkCallback));

    // Out_arg = new System.Activities.OutArgument<System.String>((string)val);
    // new ArgumentReference<string>("Out_arg");
}

protected override bool CanInduceIdle
{
    get
    {
        return true;
    }
}

void OnBookmarkCallback(NativeActivityContext context, Bookmark bookmark, object val)
{
     // Out_arg = new System.Activities.OutArgument<System.String>((string)val);
     // Out_arg = new OutArgument<String>((string)val);
     // Out_arg = ((string)val);
     Out_arg = new OutArgument<string>(new VisualBasicReference<string>((string)val));
}

第一個結果

第二個結果

謝謝你。

我覺得你是一個新的 .NET 開發人員。 當您剛開始開發時,WF4 並不是最容易進入的東西。 該框架使用了許多不明顯的設計模式,只有經驗豐富的開發人員才能掌握。 我這么說不是因為我很棒(盡管坦率地說……),而是因為文檔不清楚,而且關於 WF4 的資源還不是很多。

然而,您誤解了 WF4 中如何處理 In/OutArguments。 您必須在調用CacheMetadata之前set參數,然后使用參數的SetGet方法在運行時設置/獲取參數的值。

WF4 Arguments 模式是: Workflow 運行時需要知道您的 Activity 計划做什么,並且必須為 Workflow 提供一種方法來處理您的 Activity 需要運行的重要動態數據(在運行時更改的數據)。 工作流運行時必須更改在運行時存儲此數據並對其進行序列化/反序列化。

為了讓工作流執行此操作,它為您提供了 In/Out/InOutArguments(和變量),您可以在其中存儲易失性數據。 在調用CacheMetadata期間,工作流會了解這些實例並准備好您在運行時訪問它們所需的設施。 如果您在調用 CacheMetadata 后對這些屬性進行更改,則工作流將無法再獲取/設置/序列化/反序列化這些實例包含的數據

因此,您必須設置一次並且永遠不要再更改這些實例。 您可以通過構造函數或實現IActivityTemplateFactory來做到這一點。

這是一個簡單的例子:

public sealed class Negate : NativeActivity<bool>, IActivityTemplateFactory
{
    [RequiredArgument]
    public InArgument<bool> Input { get; set; }

    public Negate() 
    {
        // set it within the constructor option
        //Input = new InArgument<bool>();
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddArgument(Input);
        metadata.AddArgument(Result);
    }

    protected override void Execute(NativeActivityContext context)
    {
         // note the use of Get and Set methods
         Result.Set(context, !Input.Get(context));
    }

    Activity IActivityTemplateFactory.Create(DependencyObject target)
    { 
        // or we can set the Arguments here
        return new Negate 
        {
            Input = new InArgument<bool>(),
            Result = new OutArgument<bool>()
        };
    }
}

IActivityTemplateFactory.Create在 Activity 被放置在設計圖面上時被調用。 刪除后,將創建 Arguments,這發生在調用CacheMetadata之前。 這是配置這些的最佳方式,恕我直言。 使用構造函數可能會導致一些意外行為。 請注意我們如何在CacheMetadata中告訴運行時我們希望運行時為我們跟蹤的屬性。 一旦調用該方法,我們就永遠不會更改這些屬性中保存的實例。 我們只能對它們調用方法(例如GetSet )。

編輯:這是調用這些方法的簡單示例。

  • 用戶將 Activity 從工具箱中拖放到設計圖面上
  • 調用 Create 方法(在設計圖面上創建 Activity)
  • CacheMetadata 被調用
  • 用戶輸入 Input 的值
  • CacheMetadata 被調用
  • 用戶構建解決方案
  • CacheMetadata 被調用
  • 用戶運行解決方案
  • 創建工作流的一個實例
  • CacheMetadata 被調用
  • 工作流程執行
  • 執行被稱為
  • InArgument.Get 被調用
  • OutArgument.Set 被調用
  • 工作流完成執行

暫無
暫無

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

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