#c_sharp #wpf #async #async_programming
Есть класс для обработки пула задач. public class PoolManager { List>> _listFunc { get; set; } List _listName { get; set; } public bool Active { get; set; } = false; public PoolManager() { _listFunc = new List >>(); _listName = new List (); } public async Task StartPool() { if (!Active) { Active = true; while (Active) { if (_listFunc.Count != 0) { await Task.Run(async () => { var fun = _listFunc[0]; RemoveById(0); await fun(); }); } } } return ""; } public void Add(Func > func,string name) { _listFunc.Add(new Func > (func)); _listName.Add(name); } public void Stop() { Active = false; } } Всё работает, но есть необходимость запускать несколько паралельных таких пулов. запускаю я его так: if (!VP[0].Active) { await Task.Run(async () => { await VP[0].StartPool(); }); } else VP[0].Stop(); Но таким образом я могу запустить только 1 такой поток. Как можно реализовать одновременный запуск нескольких таких потоков с возможностью в последствии обращаться к ним? И соответственно без блокировки главного потока.
Ответы
Ответ 1
Создавать список Task'ов не нужно. Просто надо указать AttachedToParent Task.Factory.StartNew(() => { for(var i=0; i < 10; i++) Task.Factory.StartNew(() => { /*... */}, TaskCreationOptions.AttachedToParent); }).Wait(); Внешний Task дождется завершение всех Task'ов, запущенных в цикле. Если в основном потоке не надо ждать завершения внешнего Task, то Wait не надо указывать. Но при этом этот Task будет ждать завершение работы остальных, запущенных с AttachedToParent. Если требуется передавать данные, то надо использовать классы, например, из System.Collections.Concurrent. Пример - тут.
Комментариев нет:
Отправить комментарий