繁体   English   中英

几个WCF Web服务的异步调用

[英]Async calls of several WCF WebServices

我有一个控制台应用程序,该应用程序运行以特定顺序调用4 WCF Web服务的循环。

循环的每个迭代都不依赖于上一个或下一个迭代。

循环的每次迭代大约需要5秒钟。

我想使用一些并行或异步工作来减少时间。

基本上,我在想的是,当我在等待其中一项服务时,我可能会得到另一个迭代,从而调用其他四项服务之一。

但是,在我的尝试中,这没有用。

我试图做这样的事情:

dataRows.ToList().ForEach(async patientRow =>
{
     // Calls made here.  Example calls below:
     var personData = await personOperations.SavePersonAsync(personRow);

     var saveResponse = await orderingBrokerOperations
                                 .SaveAsync(orderedTestContracts, personData);

     printOperations.Print(saveResponse );
});

但这最终会提前加载大量电话。 (这意味着第一个Web服务被爆裂了许多请求。)最终,其中一个呼叫超时,因为它收到了太多的请求。

所以我尝试了这个:

Parallel.ForEach(dataRows,
         new ParallelOptions{MaxDegreeOfParallelism = 10}, (patientRow) =>
{
     // WCF calls are made synchronously
});

这避免了我的电话打扰别人,但并没有真正提高速度。

我也尝试这样做

Parallel.ForEach(dataRows,
         new ParallelOptions{MaxDegreeOfParallelism = 10}, async (patientRow) =>
{
    // Do the calls here.  Each call is made using the await keyword.
});

但是它和第一种选择有同样的问题。

出于无奈,我尝试了以下方法:

long inProgress = 0;
dataRows.ToList().ForEach(async patientRow =>
{
    inProgress++;
    if (inProgress > 10)
       Thread.Sleep();

    // Do the calls here.  Each call is made using the await keyword.

    inProgress--;
});

这也没有真正加快速度。

我的开发服务器不是很强大,但是它们应该足够强大,可以同时处理至少10个呼叫。 我不确定发生了什么。

有没有一种好方法可以将对我的服务的调用分散而不同步运行?

看一看这个实施ForEachAsync由Stephen Toub。 它应该使您能够执行所需的操作,并可以控制要同时执行的任务数。

如果可能,我还建议使WCF调用异步。 请查看帖子以获取更多详细信息。

最后,如果您不想同时执行许多异步操作,那么await它们时就不要await它们。 您可以在启动每个Task时将它们存储在列表中,然后使用Task.WhenAll await它们完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM