C # - BlockingCollection: можем ли мы иметь 2 потока Take () одинакового значения? - PullRequest
1 голос
/ 05 декабря 2010

Я использую Tasks и BlockingCollections, и они отлично справляются со своей задачей.Но, как я понимаю, метод Take () удаляет объект в очереди.Но что, если вы хотите, чтобы 2 задачи имели доступ к одному значению одновременно?

Допустим, я читаю файл и отправляю каждую строку с помощью blockingCollection.Add () на 2 задачи, но я хочу, чтобы обе задачи получали одинаковые строки и в одинаковом порядке.(каждая задача будет делать что-то свое с одной и той же строкой)

Как мне это сделать?Может ли BlockingCollection сделать это?Или я использую события для передачи значений?Если это так, пожалуйста, объясните, как вы могли бы запустить событие задачи / потока в другой задаче / потоке.

[ПРАВИТЬ] Что делать, если я сделаю это:

while (!lineCollection.IsCompleted)
{
      Line line = lineCollection.Take();
      //do my processing
      //then I add the original line back to the collection
      lineCollection.Add(line);
      //and use a "wait one" to wait for T2 to Take this line aswell 
      //Then continue my while loop
}

не очень элегантно... Это также не гарантирует синхронизацию.

1 Ответ

3 голосов
/ 05 декабря 2010

Похоже, вы просто хотите отдельную очередь для каждого потока. Добавьте одинаковые объекты в каждую очередь в том же порядке, и тогда каждый поток сможет удалить их в свое свободное время.

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