同时等待具有独立延续的多个 WCF 异步调用



我有一个方案,我需要调用多个 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 默认值为单并发模式,因此服务按顺序解析请求。

最新更新