2

我读过基于任务的异步模式,听起来很棒。现在,我有一个 WCF 服务需要调用其他 WCF 服务。这些服务返回不同的结果。异步如何使用新模式调用这些服务并等待全部完成?

4

3 回答 3

3

编辑:如果您刚刚获得 BeginXXX 和 EndXXX 方法,请参阅此问题以了解如何将它们转换为Task<T>任务 -然后我的其余答案将适用。

基本上,您需要TaskFactory<T>.FromAsync(...).


你可以使用TaskEx.WhenAll,最终会Task.WhenAll

请注意,这将等待所有任务完成,即使早期出现错误。

由于任务具有不同的结果类型,您需要将它们设置为开始,等待它们全部完成,然后获取结果:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

await TaskEx.WhenAll(t1, t2, t3);

var result1 = t1.Result;
var result2 = t2.Result;
var result3 = t3.Result;

// Use the results

或者,只需启动任务开始,并分别等待每个任务。请注意,TAP 中的任务是“热的”——它们会在您创建它们时立即启动,而不是在您等待它们时启动。所以这也可以工作 - 但是这次如果t1抛出异常,它不会等待t2t3完成:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

var result1 = await t1;
var result2 = await t2;
var result3 = await t3;

// Use the results

我已经写过关于这个的博客,首先是关于等待多个任务的一般情况,然后是关于等待多个任务时的异常

于 2010-11-04T07:46:35.693 回答
1

如果您想了解 WCF 团队支持 async/await 模型的计划,请查看以下博客文章:

关联

阿马德奥

于 2010-11-13T20:53:47.147 回答
0

请参阅Async CTP - 如何使用 async/await 调用 wcf 服务?
有关异步客户端和服务的示例。或者使用AsyncWcfLib,它支持基于Actor 的编程模型,并且具有在应用程序内或通过网络调用其他服务的服务示例。

于 2012-04-04T23:05:49.647 回答