Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Несколько параллельных потоков

#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. Пример - тут.

Комментариев нет:

Отправить комментарий