Не могу добавить предметы в коллекцию во втором раунде

По сути, у меня есть блокирующая коллекция в моем приложении службы Windows, каждый раз, когда я хочу добавить 4 элемента в коллекцию, а затем обработать ее.

Первый раунд в порядке, но второй раунд не удался. Ошибка

BlockingCollection была отмечена как полная в отношении дополнений.

Мой код:

    public static BlockingCollection<Tuple<ChannelResource, string>> bc = new BlockingCollection<Tuple<ChannelResource, string>>();
    public static List<string> list = new List<string>(); // then add 100 items to it.

Основной код приложения:

            ProcessCall pc = new ProcessCall(OvrTelephonyServer, bc);
            while (true)
            {
                ThreadEvent.WaitOne(waitingTime, false);

                lock (SyncVar)
                {
                    Console.WriteLine("Block begin");
                    for (int i = 0; i < 4; i++)
                    {
                        var firstItem = list.FirstOrDefault();
                        ChannelResource cr = OvrTelephonyServer.GetChannel();
                        bc.TryAdd(Tuple.Create(cr, firstItem));
                        list.Remove(firstItem);
                    }
                    bc.CompleteAdding();
                    pc.SimultaneousCall();
                    Console.WriteLine("Blocking end");
                    if (ThreadState != State.Running) break;
                }
            }

Я понял, что был код bc.CompleteAdding(); заблокировать дальнейшие дополнения. Поэтому я прокомментировал это, но это не пойдет во второй раунд блок. Он не дошел до кода Console.WriteLine("Blocking end"); Это было так же, как моя старая нить.

1 ответ

Решение

По подсказке TaW я воссоздаю коллекцию в каждой итерации.

Каждая итерация имеет свою CompleteAdding(),

                lock (SyncVar)
                {
                    bc = new BlockingCollection<Tuple<ChannelResource, string>>();
                    ProcessCall pc = new ProcessCall(OvrTelephonyServer, bc);
                    if (list.Count > 0)
                    {
                        Console.WriteLine("Block begin");
                        for (int i = 0; i < 4; i++)
                        {
                            if (list.Count > 0)
                            {
                                var firstItem = list.FirstOrDefault();
                                ChannelResource cr = OvrTelephonyServer.GetChannel();
                                bc.TryAdd(Tuple.Create(cr, firstItem));
                                list.Remove(firstItem);
                            }
                        }
                        bc.CompleteAdding();
                        pc.SimultaneousCall();
                        Console.WriteLine("Blocking end");
                    }
                    if (ThreadState != State.Running) break;
                }
Другие вопросы по тегам