C # Возможен ли параллельный цикл foreach while? - PullRequest
4 голосов
/ 15 августа 2010

Я не уверен, как работает обработка внутренних потоков в Parallel.foreach и может ли она гарантировать, что такая конструкция будет работать?

Parallel.Foreach(Connections, c =>
    {
        Input in = c.getInput();
        while (in.hasNext()) {
            object o = in.getNext();
            dosomething(o);
        }
    }
);

, где in.hasNext () просто ожидаетобъект во входном потоке и возвращает true.По сути, я могу запустить несколько бесконечных циклов while в параллельной структуре foreach, гарантируя, что все они будут выполняться одновременно.добавление (и удаление, что должно быть тривиально) соединений, и он все равно будет читать входные данные из всех соединений в списке).

Ответы [ 3 ]

0 голосов
/ 15 августа 2010
  1. Количество потоков, использующих его, ограничено, поэтому некоторые элементы будут обрабатываться один за другим.

  2. Редактирование списков при перечислении не является хорошим. Скорее всего, вы получите исключение (зависит от используемого вами списка

  3. Почему бы не создать новый поток для каждого соединения?

Пример кода:

public ConnectionOpen(data)  
{  
    Connection conn=new ...  
    lock(Connections)  
    {  
         Connections.Add(conn);  
    }  

    new Thread(()=>  
    {  
        Receive(conn);//infinite loop goes here  
    }).Start();  
}  

public ConnectionClose(conn)  
{  
    bool removed=false;  
    lock(Connections)  
    {  
        removed=Connections.Remove(conn);  
    }  
    if(removed) conn.StopReceiving();  
}  
0 голосов
/ 16 августа 2010

Технически, этот код будет работать, но точное число потоков, работающих «одновременно», будет варьироваться.

В дополнение к параллельным расширениям .NET 4 также добавил «восхождение на холм» и внедрение потоков впул потоков, поэтому в основном пул потоков .NET попытается добавить потоки в цикл Parallel.ForEach, чтобы увидеть, завершится ли больше потоков, поскольку ваши никогда не завершат, число потоков будет различным, но я предполагаю, что это будет не идеально.

Вы можете попытаться использовать конструкцию ParallelWhile, команда опубликовала в блоге несколько способов сделать это, вот один .

0 голосов
/ 15 августа 2010

Как правило, я могу запустить несколько бесконечных циклов while в параллельной структуре foreach, гарантируя, что все они будут работать одновременно

Нет. Одновременно будет запущено только ограниченное количество рабочих потоков, поэтому, если вы запустите больше бесконечных циклов, чем потоков, последние никогда не запустятся ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...