我有一个控制台应用程序,它运行一个以特定顺序调用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个呼叫。我不确定发生了什么。
有没有一种方法可以在不同步运行的情况下分散对我的服务的调用?
答案 0 :(得分:4)
看看Stephen Toub对ForEachAsync
await
的实施情况。它应该使您能够执行所需的操作,并允许控制要同时执行的任务数。
我还建议尽可能使您的WCF调用异步。有关更多详细信息,请查看this帖子。
在决赛中如果你想同时执行多个异步操作,那么你就不会Task
它们,因为你正在将它们踢掉。您将每个Task.WhenAll
存储在列表中,然后您使用await
{{1}}完成它们。