【发布时间】:2019-03-08 04:57:53
【问题描述】:
我有一个方法,它包含两个列表(1. 要搜索的项目和 2. 要搜索的工作人员)。每个工作人员从列表中获取一个项目,搜索它,并将结果添加到更新 UI 线程(列表视图)的全局结果列表中。
这是我目前想出的:
List<Result> allResults = new List<Result>();
var search = new Search(workers);
//Will be full with items to search for
var items= new ConcurrentBag<item>();
while (items.Any())
{
foreach (var worker in workers)
{
if (!items.Any())
break;
IEnumerable<Result> results = null;
Task.Factory.StartNew(() =>
{
if (ct.IsCancellationRequested)
return;
items.TryTake(out Item item);
if (item == null)
return;
results= search.DoWork(worker, item);
}, ct);
if (results?.Any() ?? false)
{
allResults.AddRange(reults);
}
//Update UI thread here?
}
}
工作人员应该并行搜索,并将他们的结果添加到全局结果列表中。然后,此列表将刷新 UI。
我是否在上述方法的正确轨道上?工人会并行运行吗?我是否应该更新任务中的 UI 线程并使用BeginInvoke?
【问题讨论】:
-
您似乎正试图将项目分配给一系列工人。那正确吗?您正在尝试并行处理项目的平面列表?
-
@Enigmativity 是的。工作人员将为列表获取一个项目并异步处理它。直到列表为空为止。
标签: c# winforms async-await task