在for循环中同步消费异步wcf服务
Posted
技术标签:
【中文标题】在for循环中同步消费异步wcf服务【英文标题】:Consume asynchronous wcf service synchronously in for loop 【发布时间】:2017-01-11 11:00:13 【问题描述】:在我的 Silverlight 应用程序中。我必须使用 WCF 服务。现在的问题是我想在 for 循环中同步使用异步 wcf 服务。
服务有点
private void GetCurrentDateTimeServiceCall(int i)
ExportWcfClient proxy = new ExportWcfClient();
proxy.GetCurrentDateTimeCompleted += ProxyGetCurrentDateTimeCompleted;
proxy.GetCurrentDateTimeAsync(i);
现在我在代码中调用服务。
for(int i=0;i<length;i++)
a[i] =something;
GetCurrentDateTimeServiceCall(i);
list = a[i]*.895+a[i]*a[i];
blah blah
问题是因为服务是异步的。很难同步消费服务。最初我将第二个服务调用放在第一个服务调用的完成方法中。第三个放在完成方法的第二个等中。
但在 for 循环中,长度是不同的。我们不知道号码。而且服务是一样的,只是传入不同的整数。
顺便说一句,我使用 Visual Studio 2010,.NET 4。所以我不能使用 async/await 技能。 感谢帮助。
编辑
因为服务是异步的,所以有时候GetCurrentDateTimeServiceCall(i);
下面的代码可能会先运行。例如,list = a[i]*.895+a[i]*a[i];
在服务调用之前运行。这不是预期的。我无法访问服务端代码。此外,我无法触摸应用程序配置,因为它在我们的数据访问层框架中。所以也许我需要一个标志或事件或 while 循环来强制整个流程同步运行。
【问题讨论】:
对了,你可以:blogs.msdn.microsoft.com/bclteam/2012/10/22/… @PeterBons。不要这么想。它需要 Visual Studio 2012 和 Nuget。我在 Visual Studio 2010 中没有它们。 啊太糟糕了..我的错误,不知道 2012 年是最小值 【参考方案1】:WCF 客户端支持同步调用。它们也应该被生成。应该有一个方法GetCurrentDateTime
。如果您出于某种原因需要异步 API,请生成基于 Task
的客户端(TAP,而不是 EAP)。然后,如果你想同步,由于某种原因不能直接使用同步方法,你可以使用Task.Wait()
来阻塞。
请注意,服务器独立于客户端,因为客户端可以同步或异步,无论服务器内部做什么。 总是可以调用 WCF 服务同步和异步。
【讨论】:
是的。但我的理解是 Silverlight 只使用异步。见here。 google.com/…,例如codeproject.com/Articles/31018/… 这能解决您的问题吗?在任何情况下,您都可以生成 TAP 并使用 Wait(),如解释的那样。你也可以用更尴尬的方式等待 EAP。 在我的情况下,我不能使用 channelfactory。我想使用 Task and Wait 来尝试一下。但还是没有头绪。我应该将 void 方法更改为 Task 吗?需要代码。 您需要详细说明您遇到的具体问题。我已经为您提供了多种解决问题的方法。 我编辑了这个问题。希望它提供了详细信息。以上是关于在for循环中同步消费异步wcf服务的主要内容,如果未能解决你的问题,请参考以下文章
为啥 WCF 异步方法在同步时不会抛出 FaultException?