0

我正在编写一个 WPF 应用程序,它需要根据列表中的项目对 WCF 服务进行多次调用。

foreach(var item in items)
{
    var dataAboutItem = MethodThatCallsWCFService(item);

    //  Do work to update UI
    .
    .
    .
}

是否有一种聪明的方法可以使用 Tasks/Parallel.ForEach 或 TPL 中的某些构造来执行此操作,它可以让我在后台线程上进行所有服务调用,然后在每次调用的结果出现时相应地更新 UI?

4

2 回答 2

1

如果您可以使用 C# 5.0,那么async-await可以帮助您。WCF 服务的代码生成器支持async- await,因此它可以生成方法的异步版本,这将很有用。

您要做的是异步启动所有请求,并将Task它们返回的 s 存储在一个集合中。然后,在Task完成时处理 s。.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 数据流,指定MaxDegreeOfParallelism.

于 2012-09-20T15:33:00.700 回答
0

任务并行库

Parallel.ForEach

最后一个示例有 UI

数据和任务并行的潜在陷阱

或者更新 UI 绑定的公共属性,而不是直接更新 UI。

如果这不会加载 CPU,您可能需要使用 MaxDegreeOfParallelism 来防止过多的线程启动。

ParallelOptions.MaxDegreeOfParallelism

于 2012-09-19T22:32:47.420 回答