Я читал о BlockingCollection (конкретный пример одновременных коллекций) и наткнулся на эту небольшую программу, которая демонстрирует, как они работают. Эта программа удваивает мой ввод (все, что я набираю, удваивается, когда я нажимаю клавишу ввода), и так продолжается до тех пор, пока я не введу пробел.
Мой вопрос: почему программа не блокирует первую строку «while (true)»?
Я предполагаю, что BlockingCollection блокирует задачу чтения, когда нет элемента, который нужно удалить из коллекции, поэтому я предполагаю, что он освобождается снова после того, как произойдет col.Add (s), потому что элемент становится доступным.
Во-вторых, когда вводится пробел, почему не останавливается только текущий поток (тот, у которого есть задача записи)? Разве задача чтения не должна продолжать ждать разблокировки навсегда? Вместо этого вся программа прекращается.
public static class ConcurrentCollections
{
public static void Main()
{
BlockingCollection<string> col = new BlockingCollection<string>();
Task read = Task.Run(() =>
{
while (true)
{
Console.WriteLine(col.Take());
}
});
Task write = Task.Run(() =>
{
while (true)
{
string s = Console.ReadLine();
if (string.IsNullOrWhiteSpace(s)) break;
col.Add(s);
}
});
write.Wait();
Console.ReadLine();
}
}