多个WCF WebServices的异步调用

本文关键字:异步 调用 WebServices WCF 多个 | 更新日期: 2023-09-27 18:11:07

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

循环的每次迭代不依赖于前一次或下一次迭代。

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

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

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

然而,在我的尝试中,这并没有起作用。

我试过这样做:

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--;
});

这也没有真正加快速度。

我的Dev服务器不是很强大,但它们应该足够强大,可以同时处理至少10个调用。我不知道发生了什么事。

是否有一种很好的方法来分散调用到我的服务而不同步运行?

多个WCF WebServices的异步调用

看看Stephen Toub对ForEachAsync的实现。它应该使您能够做您想做的事情,并允许控制您想要并发执行的任务数量。

如果可能的话,我还建议将WCF调用设置为异步的。看看这篇文章了解更多细节。

在final not中,如果你想并发地执行许多异步操作,你不需要在启动它们时将它们await。你将每个Task存储在一个列表中,因为它们被踢开,然后你使用Task.WhenAllawait它们的完成。