我有一个控制台应用程序,它运行一个以特定顺序调用 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 个调用。我不确定发生了什么。
有没有一种好方法可以在不同步运行的情况下分散对我的服务的调用?
最佳答案
看看this Stephen Toub 实现 ForEachAsync
。它应该使您能够做您想做的事,并且可以控制要同时执行的任务数量。
我还建议尽可能使 WCF 调用异步。看看this发布更多详细信息。
如果您想同时执行许多异步操作,则不要在结束时 await
它们。当每个 Task
被启动时,您将它们存储在一个列表中,然后您使用 Task.WhenAll
来等待
它们的完成。
关于c# - 多个 WCF Web 服务的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520239/