几个WCF Web服务的异步调用

时间:2014-07-01 22:33:50

标签: c# .net asynchronous async-await

我有一个控制台应用程序,它运行一个以特定顺序调用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--;
});

这并没有真正加快速度。

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

有没有一种方法可以在不同步运行的情况下分散对我的服务的调用?

1 个答案:

答案 0 :(得分:4)

看看Stephen Toub对ForEachAsync await的实施情况。它应该使您能够执行所需的操作,并允许控制要同时执行的任务数。

我还建议尽可能使您的WCF调用异步。有关更多详细信息,请查看this帖子。

在决赛中如果你想同时执行多个异步操作,那么你就不会Task它们,因为你正在将它们踢掉。您将每个Task.WhenAll存储在列表中,然后您使用await {{1}}完成它们。