Не могу добавить предметы в коллекцию во втором раунде
По сути, у меня есть блокирующая коллекция в моем приложении службы 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;
}