我在 MSDN 上遇到了与这个问题相同的问题,但我不明白解决方案,因为我仍然不清楚 Roman Kiss 的解决方案是否会在同时执行单个工作流实例时正确替换端点地址。
当内部Send
活动被安排由具有特定端点地址的一个线程执行时,该地址不会被另一个调度具有不同端点地址的相同活动的线程覆盖吗?如果我弄错了,请纠正我,但我认为它会,因为它Send.Endpoint
是一个常规属性,它反对InArgument<Endpoint>
绑定到任何当前工作流执行上下文。
有人可以对此进行更多说明吗?
更新
我测试了 Roman Kiss 提供的解决方案,结果发现它在我的场景中没有按预期工作。我修改Execute
方法如下:
protected override void Execute(NativeActivityContext context)
{
Thread.Sleep(Address.Get(context).EndsWith("1") ? 1000 : 0);
Body.Endpoint.Binding = GetBinding(Binding.Get(context));
Body.Endpoint.AddressUri = new Uri(Address.Get(context));
Thread.Sleep(Address.Get(context).EndsWith("1") ? 0 : 3000);
var address = Address.Get(context) + " => " + Body.Endpoint.AddressUri;
Console.WriteLine(address);
Thread.Sleep(10000);
context.ScheduleActivity(Body);
}
跑了这个测试:
static void Main(string[] args)
{
// Workflow1 is just a SendScope wrapped around by a Sequence with single Address input argument exposed
var workflow = new Workflow1();
Task.WaitAll(
Task.Run(() => WorkflowInvoker.Invoke(workflow, new Dictionary<string, object> { { "Address", @"http://localhost/1" } })),
Task.Run(() => WorkflowInvoker.Invoke(workflow, new Dictionary<string, object> { { "Address", @"http://localhost/2" } })));
Console.ReadLine();
}
我得到的结果是:
http://localhost/1 => http://localhost/1
http://localhost/2 => http://localhost/1
问题仍然悬而未决:如何Send
在运行时动态分配我的活动的端点地址?