基本上我的 Windows 服务应用程序中有一个阻塞集合,每次我想向集合中添加 4 个项目然后对其进行处理。
第一轮还好,第二轮就失败了。
错误是
BlockingCollection 已被标记为已完成添加。
My code:
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");
和我的一样旧线程。 https://stackoverflow.com/questions/25169264/not-reach-the-code-as-expected
根据 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)