Windows 工作流:从 WorkflowApplication 获取变量
Windows Workflow: Getting variable from WorkflowApplication
我正在使用 Windows Workflow Foundation (WWF)。我用一个序列制作了一个 Activity (XAML),我在其中定义了一个变量。
I 运行 activity 在控制台应用程序中通过创建 WorkflowApplication 实例。如何在我的控制台应用程序中获取变量的值?
我在 XML 中保留了一个 WorkflowApplication 实例,在其中我看到了我的变量及其值。有什么正确的方法可以从 XML?
中获取变量的值吗?
因此,在您上次的评论中,您表示希望在工作流完成之前在控制台应用程序中获取状态。不幸的是 In/Out 和 Out 参数仅在工作流完成后可用。但是有一些方法可以使用工作流变量和参数以外的其他构造与主机进程进行通信。
其中一种方法是使用可用于与主机进程交互的自定义扩展。扩展可以是任何类型,并且可用于工作流和宿主进程。一个完整的例子:
using System;
using System.Activities;
namespace WorkflowDemo
{
class Program
{
static void Main(string[] args)
{
var app = new WorkflowApplication(new MyCustomActivity());
var myExtension = new MyCommunicationExtension();
myExtension.MyValueChanged += (s, e) => Console.WriteLine(myExtension.MyValue);
app.Extensions.Add(myExtension);
app.Run();
Console.ReadKey();
}
}
public class MyCommunicationExtension
{
public string MyValue { get; private set; }
public event EventHandler<EventArgs> MyValueChanged;
public void OnMyValueChanged(string value)
{
MyValue = value;
MyValueChanged?.Invoke(this, EventArgs.Empty);
}
}
public class MyCustomActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
var extensionObj = context.GetExtension<MyCommunicationExtension>();
if (extensionObj != null)
{
extensionObj.OnMyValueChanged("Hello World");
}
}
}
}
我正在使用 Windows Workflow Foundation (WWF)。我用一个序列制作了一个 Activity (XAML),我在其中定义了一个变量。
I 运行 activity 在控制台应用程序中通过创建 WorkflowApplication 实例。如何在我的控制台应用程序中获取变量的值?
我在 XML 中保留了一个 WorkflowApplication 实例,在其中我看到了我的变量及其值。有什么正确的方法可以从 XML?
中获取变量的值吗?因此,在您上次的评论中,您表示希望在工作流完成之前在控制台应用程序中获取状态。不幸的是 In/Out 和 Out 参数仅在工作流完成后可用。但是有一些方法可以使用工作流变量和参数以外的其他构造与主机进程进行通信。
其中一种方法是使用可用于与主机进程交互的自定义扩展。扩展可以是任何类型,并且可用于工作流和宿主进程。一个完整的例子:
using System;
using System.Activities;
namespace WorkflowDemo
{
class Program
{
static void Main(string[] args)
{
var app = new WorkflowApplication(new MyCustomActivity());
var myExtension = new MyCommunicationExtension();
myExtension.MyValueChanged += (s, e) => Console.WriteLine(myExtension.MyValue);
app.Extensions.Add(myExtension);
app.Run();
Console.ReadKey();
}
}
public class MyCommunicationExtension
{
public string MyValue { get; private set; }
public event EventHandler<EventArgs> MyValueChanged;
public void OnMyValueChanged(string value)
{
MyValue = value;
MyValueChanged?.Invoke(this, EventArgs.Empty);
}
}
public class MyCustomActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
var extensionObj = context.GetExtension<MyCommunicationExtension>();
if (extensionObj != null)
{
extensionObj.OnMyValueChanged("Hello World");
}
}
}
}