У меня есть метод, который состоит из двух списков (1. элементы для поиска и 2. рабочие для поиска).Каждый работник берет элемент из списка, ищет его и добавляет результаты в глобальный список результатов, который обновляет поток пользовательского интерфейса (представление списка).
Это то, что я до сих пор придумал:
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?
}
}
Рабочие должны выполнять параллельный поиск, а их результаты добавляются в глобальный список результатов.Этот список затем обновит пользовательский интерфейс.
Я на правильном пути с вышеуказанным подходом?Будут ли рабочие работать параллельно?Должен ли я обновить поток пользовательского интерфейса в задаче и использовать BeginInvoke
?