gpt4 book ai didi

c# - 无法在第二轮将项目添加到集合中

转载 作者:行者123 更新时间:2023-11-30 18:28:20 24 4
gpt4 key购买 nike

基本上我的 Windows 服务应用程序中有一个 blockingcollection,每次我想向集合中添加 4 个项目然后处理它。

第一轮还好,第二轮就失败了。错误是

The BlockingCollection has been marked as complete with regards to additions.

我的代码:

    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(); 可以阻止进一步的添加。所以我把它注释掉了,但它不会进入第二轮 block 。它没有到达代码 Console.WriteLine("Blocking end"); 和我的一样 old thread.

最佳答案

根据 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;
}

关于c# - 无法在第二轮将项目添加到集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com