У меня такое ощущение, что вы новый разработчик .NET. WF4 - не самая простая вещь, с которой вы можете столкнуться, когда вы новичок в разработке. Существует ряд неочевидных шаблонов проектирования, которые использует фреймворк, которые могут понять только опытные разработчики. Я говорю это не потому, что я потрясающий (хотя, честно говоря ...), а потому, что документация не ясна, а ресурсов по WF4 пока не так много.
Тем не менее, вы неправильно понимаете, как обрабатываются In / OutArguments в WF4. Вы должны set
аргумент до CacheMetadata вызываться, а затем использовать Set и Get методы аргумента, чтобы установить / получить значение аргумент во время выполнения.
Шаблон аргументов WF4: Среда выполнения рабочего процесса должна знать, что планирует делать ваша деятельность, и должна предоставлять возможность рабочему процессу обрабатывать важные динамические данные (данные). который изменяется во время выполнения) ваша активность должна работать. Время выполнения рабочего процесса должно быть изменено для хранения этих данных во время выполнения и их сериализации / десериализации.
Чтобы рабочий процесс мог это сделать, он предоставляет вам 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
вызывается, когда действие отбрасывается на поверхность проектирования. После удаления создаются аргументы, которые происходят до вызова CacheMetadata
. Это лучший способ настроить их, imho. Использование конструктора может привести к неожиданному поведению. Обратите внимание, как мы говорим среде выполнения в CacheMetadata
о свойствах, которые мы хотим, чтобы среда выполнения отслеживала для нас. После вызова метода мы никогда не меняем экземпляр, содержащийся в этих свойствах. Мы можем только вызывать методы (такие как Get
и Set
) для них.
Редактировать: Вот простой пример, когда эти методы вызываются.
- Пользователь перетаскивает Активность из панели инструментов и бросает ее на поверхность дизайна
- Вызывается метод create (создает действие на поверхности конструктора)
- CacheMetadata называется
- Пользователь вводит значение ввода
- CacheMetadata называется
- Пользователь создает решение
- CacheMetadata называется
- Пользователь запускает решение
- Создан экземпляр рабочего процесса
- CacheMetadata называется
- Рабочий процесс выполняется
- Выполнить называется
- InArgument.Get называется
- OutArgument.Set называется
- Рабочий процесс завершает выполнение