【问题标题】:WCF service call async other WCF servicesWCF 服务调用异步其他 WCF 服务
【发布时间】:2011-05-04 22:16:03
【问题描述】:

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

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

    编辑:如果您刚刚获得 BeginXXX 和 EndXXX 方法,请参阅 this question 了解如何将它们转换为 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
    

    我在博客上写过这个,首先是 waiting for multiple tasks in general,然后是 exceptions when waiting for multiple tasks

    【讨论】:

    • 感谢您的回答,但我还没有完全理解。我认为 service1、service2 和 service3 是服务的代理客户端。 DoFirstTaskAsync、DoSecondTaskAsync 和 DoThirdTaskAsync 是这些服务上的方法。但是这些方法不返回 Task 或 Task,它们返回 IList,并且方法的签名是 IAsyncResult BeginSomthing 和 IList EndSomthing(用于实现异步模式)我错在哪里?
    【解决方案2】:

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

    http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-with-async-await.aspx

    阿玛迪欧

    【讨论】:

      【解决方案3】:

      Async CTP - How can I use async/await to call a wcf service?
      有关异步客户端和服务的示例。 或者使用AsyncWcfLib,它支持Actor based programming model,并且有服务在应用程序内部或通过网络调用其他服务的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2018-09-07
        • 1970-01-01
        相关资源
        最近更新 更多