如何等待异步 WCF 服务方法完成? [复制]

Posted

技术标签:

【中文标题】如何等待异步 WCF 服务方法完成? [复制]【英文标题】:How can I wait for an async WCF service method to complete? [duplicate] 【发布时间】:2015-02-13 20:35:41 【问题描述】:

我的 WCF 服务中有两种方法:

public interface IPriceService

    [OperationContract(Name = "GetPrice")]
    decimal GetPrice(long ID);

    [OperationContract(Name = "GetProductID")]
    long GetProductID(string productName);

在客户方面,我想做两件事。我想调用一个方法GetProductID,然后调用一个方法GetPrice。所以我这样做:

PriceService.PriceServiceClient service;
service = new PriceService.PriceServiceClient();
service.PobierzPrzejsciaCompleted += service_GetPriceCompleted;
service.PobierzStacjeBenzynoweCompleted += service_GetProductIDCompleted;

service.GetProductIDAsync(productName);
service.GetPriceAsync(Id);

GetProductID 返回一个 ID,所以我在 GetProductIDCompleted 事件中得到它。然后我将此 ID 作为参数传递给GetPrice 方法。

我想要的是:GetProductIdAsync 方法应该首先执行。 GetPriceAsync 方法应该等到前一个方法完成。

【问题讨论】:

他们是awaitable吗?为什么不await service.GetProductIDAsync(productName); 实现TaskCompletionSource。也许this answer 会有所帮助。 在添加服务引用时,Windows Phone 8.1 中没有可用的“生成基于任务的操作”。 构建一个您定义TCS的Task,然后订阅您的服务事件,在TCS的完整委托集结果中,返回TCS.Task。然后等待你的新任务。这是converting EAP to TAP - example。 哦,谢谢。但这对我来说真的很难理解...... 【参考方案1】:

如果你想让它们同步执行,你也可以简单地使用同步版本:

var productId = service.GetProductID(productName)
var price = service.GetPrice(productId)

如果您想坚持异步调用,您可以从 service_GetProductIDCompleted 完成的函数中调用 service.GetPriceAsync 函数...

【讨论】:

【参考方案2】:

您可以使用 BackgroundWorker 对象,然后订阅 run worker 完成事件。在那种情况下,您将能够运行它。

类似

Worker.RunWorkerAsync()
Worker.RunWorkerCompleted += youractionwhencompletedmethod

【讨论】:

以上是关于如何等待异步 WCF 服务方法完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用异步等待

等待多个异步调用完成?

C#如何强制等待连接到 WCF 服务

异步调用 WCF 服务并在新任务中等待它

WCF系列教程之客户端异步调用服务

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?