[英]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
參數,然后使用參數的Set和Get方法在運行時設置/獲取參數的值。
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
中告訴運行時我們希望運行時為我們跟蹤的屬性。 一旦調用該方法,我們就永遠不會更改這些屬性中保存的實例。 我們只能對它們調用方法(例如Get
和Set
)。
編輯:這是調用這些方法的簡單示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.