如何等待异步 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 服务方法完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章