[英]Async WCF calls in a loop using tasks
我正在编写一个WPF应用程序,该应用程序需要基于列表中的项目对WCF服务进行大量调用。
foreach(var item in items)
{
var dataAboutItem = MethodThatCallsWCFService(item);
// Do work to update UI
.
.
.
}
是否有一种聪明的方法可以使用Tasks / Parallel.ForEach或TPL中的某些构造来执行此操作,从而让我在后台线程上进行所有服务调用,然后根据每次调用的结果来相应地更新UI?
如果可以使用C#5.0,则async
- await
可以帮助您。 WCF服务的代码生成器支持async
- await
,因此它可以生成方法的异步版本,这将很有用。
您要做的是异步启动所有请求,并将它们返回的Task
存储在集合中。 然后,在完成Task
处理。 .Net不支持开箱即用,但是您可以使用Stephen Toub的Interleaved()
方法 :
var tasks = new List<Task<DataAboutItem>>();
foreach (var item in items)
{
// don't await here yet
Task<DataAboutItem> dataAboutItemTask = MethodThatCallsWCFServiceAsync(item);
tasks.Add(dataAboutItemTask);
}
foreach (var bucket in Interleaved(tasks))
{
var dataAboutItemTask = await bucket;
DataAboutItem dataAboutItem = await dataAboutItemTask;
// Do work to update UI
}
如果要限制调用WCF服务(例如,一次仅发出10个请求),则可以改用TPL Dataflow,指定MaxDegreeOfParallelism
。
任务并行库
最后一个样本具有用户界面
或更新UI绑定到的公共属性,而不是直接更新UI。
如果这不会加载CPU,则可能需要使用MaxDegreeOfParallelism来防止过多的线程旋转。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.