在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?

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

System.OutOfMemoryException 对 WCF 服务的多个异步调用

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

WCF - 通道工厂与客户群

WCF系列WCF客户端怎么消费服务