#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. Пример - тут.
Комментариев нет:
Отправить комментарий