Здравствуйте, кто-то, кого я никогда раньше не встречал и просто делится своим IP.
Вы делаете что-то не так. В другом месте это.
Либо DLL с используемыми вами действиями не является новой, либо определение рабочего процесса устарело и не содержит того, что, как вы считаете, оно делает. Или это что-то совершенно другое.
Я сократил ваш код и сжал его до примера проекта. Хотелось бы увидеть это здесь мы идем:
Это простое условие:
public sealed class AnTrigger : NativeActivity<bool>
{
public bool ResultToSet { get; set; }
protected override void Execute(NativeActivityContext context)
{
Result.Set(context, ResultToSet);
}
}
Просто, нет? Вот хост, который оценивает это условие и, если он возвращает true, выполняет одно дочернее действие. Обратите внимание, я создаю действие в методе Create, поэтому мне не нужно создавать редактор.
public sealed class AnTriggerHost : NativeActivity, IActivityTemplateFactory
{
public ActivityFunc<bool> Condition { get; set; }
public ActivityAction Child { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.ScheduleFunc(Condition, OnConditionComplete);
}
private void OnConditionComplete(
NativeActivityContext context,
ActivityInstance completedInstance,
bool result)
{
if (result)
context.ScheduleAction(Child);
}
Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
{
// so I don't have to create UI for these, here's a couple samples
// seq is the first child and will run as the first AnTrigger is configured to return true
// so the first trigger evals to true and the first child runs, which
var seq = new Sequence
{
DisplayName = "Chief Runs After First Trigger Evals True"
};
// prints this message to the console and
seq.Activities.Add(new WriteLine { Text = "See this? It worked." });
// runs this second trigger host, which
seq.Activities.Add(
new AnTriggerHost
{
DisplayName = "This is the SECOND host",
Condition = new ActivityFunc<bool>
{
// will NOT be triggered, so you will never see
Handler = new AnTrigger
{
ResultToSet = false,
DisplayName = "I return false guize"
}
},
Child = new ActivityAction
{
// this activity write to the console.
Handler = new WriteLine
{
Text = "you won't see me"
}
}
});
return new AnTriggerHost
{
DisplayName = "This is the FIRST host",
Condition = new ActivityFunc<bool>
{
Handler = new AnTrigger
{
ResultToSet = true,
DisplayName = "I return true!"
}
},
Child = new ActivityAction
{
Handler = seq
}
};
}
}
Перетащите эти два в приложение Workflow Console и поместите AnTriggerHost в рабочий процесс. Установите пару контрольных точек и наблюдайте, как они летят. Вот рабочий процесс xaml:
<local:AnTriggerHost DisplayName="This is the FIRST host" >
<local:AnTriggerHost.Child>
<ActivityAction>
<Sequence DisplayName="Chief Runs After First Trigger Evals True">
<WriteLine Text="See this? It worked." />
<local:AnTriggerHost DisplayName="This is the SECOND host">
<local:AnTriggerHost.Child>
<ActivityAction>
<WriteLine Text="you won't see me" />
</ActivityAction>
</local:AnTriggerHost.Child>
<local:AnTriggerHost.Condition>
<ActivityFunc x:TypeArguments="x:Boolean">
<local:AnTrigger DisplayName="I return false guize" ResultToSet="False" />
</ActivityFunc>
</local:AnTriggerHost.Condition>
</local:AnTriggerHost>
</Sequence>
</ActivityAction>
</local:AnTriggerHost.Child>
<local:AnTriggerHost.Condition>
<ActivityFunc x:TypeArguments="x:Boolean">
<local:AnTrigger DisplayName="I return true!" ResultToSet="True" />
</ActivityFunc>
</local:AnTriggerHost.Condition>
</local:AnTriggerHost>
Ваша проблема не в действиях, а в том, как вы их используете. Вы предполагаете, что ваша испытательная установка правильна, когда это не так.
Для дальнейшего использования ... Когда это происходит со мной, причина в том, что я установил Result
в методе Create IActivityTemplateFactory
Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
{
return new Child
{
InputText = new InArgument<string>(
new VisualBasicValue<string>(Parent.InputTextVariable)),
// the following demonstrates what NOT to do in the Create method.
// this BREAKS your ActivityFunc, which will ALWAYS return default(T)
// DO NOT SET Result AT ANY TIME OR IN ANY PLACE
// BEGIN ERROR
Result = new OutArgument<string>()
// END ERROR
};
}
В результате получается набор результатов в определении рабочего процесса, который нарушает шаблон ActivityFunc.
<!--If you see ActivityFunc.Result in your workflow, DELETE IT -->
<ActivityFunc.Result>
<DelegateOutArgument x:TypeArguments="x:String" />
</ActivityFunc.Result>