我有一个方案,我需要调用多个 WCF 异步调用,这些调用可以彼此独立地进行,每个调用都有自己的更新 UI 的延续。
假设我有一个这样的函数:
private Task<bool> ExecuteSomeWorkAsync(int delay)
{
int _delay = delay;
var t = Task<bool>.Factory.StartNew(
() =>
{
Thread.Sleep(_delay);
return true;
});
return t;
}
如果我创建一个本地 WPF 应用程序,该应用程序进行多次调用,每个调用的时间可能会随时间变化以返回结果,则它按预期工作。 在示例中,第二个任务在第一个任务之前完成,绑定到第二个属性的 UI 元素在第一个任务之前更新。
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
await Task.WhenAll(
ExecuteSomeWorkAsync(2000).ContinueWith(task1 => { SomePropertyBoundToUIElement1 = task1.Result; }, uiScheduler),
ExecuteSomeWorkAsync(1000).ContinueWith(task2 => { SomePropertyBoundToUIElement2 = task2.Result; }, uiScheduler)
);
但是,如果我尝试在通过客户端代理调用 ExecuteSomeWorkAsync 的 WCF 中实现这一点,则 UI 仅在最慢之后更新 任务完成。
那么,有没有办法在WCF中做到这一点呢?
为了回答我自己的问题,有一种方法可以使该示例在 WCF 中工作。 解决方案是指定足够的并发模式选项。
通过使用此服务行为修饰 WCF 服务,我得到了我所追求的并行性。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
显然,WCF 默认值为单并发模式,因此服务按顺序解析请求。