gpt4 book ai didi

C# 线程和队列

转载 作者:可可西里 更新时间:2023-11-01 08:38:30 26 4
gpt4 key购买 nike

这不是关于我可以或应该使用的不同方法来以最佳方式利用队列,而是关于我所看到的对我来说毫无意义的事情。

void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}

这是在单线程中运行的:

var t = new Thread(Runner);
t.IsBackground = true;
t.Start();

其他事件在其他地方“排队”。我所看到的情况是在一段时间后,Dequeue 实际上会抛出 InvalidOperationException,队列为空。这应该是不可能的,因为计数如何保证那里有东西,而且我很肯定没有其他东西正在“出队”。

问题:

  1. Enqueue 是否有可能在项目完全进入队列之前实际增加计数(无论那是什么意思...)?
  2. 线程是否可能在 Dequeue 语句处以某种方式重新启动(过期、重置...),但在它已经删除了一个项目之后立即重新启动?

编辑(澄清):

这些代码片段是实现后台辅助线程的 Wrapper 类的一部分。这里的Dequeue是唯一的Dequeue,所有的Enqueue/Dequeue都在Synchronized成员变量(queue)上。

最佳答案

使用 Reflector,您可以看到不,直到添加项目后计数才增加。

正如 Ben 所指出的,看起来确实有多个人调用 dequeue。

你说你肯定没有其他东西在调用 dequeue。那是因为你只有一个线程调用 dequeue 吗? dequeue 是否在其他任何地方被调用?

编辑:

我写了一些示例代码,但无法重现问题。它一直在运行,没有任何异常。

在出现错误之前它运行了多长时间?也许您可以分享更多代码。

class Program
{
static Queue q = Queue.Synchronized(new Queue());
static bool running = true;

static void Main()
{
Thread producer1 = new Thread(() =>
{
while (running)
{
q.Enqueue(Guid.NewGuid());
Thread.Sleep(100);
}
});

Thread producer2 = new Thread(() =>
{
while (running)
{
q.Enqueue(Guid.NewGuid());
Thread.Sleep(25);
}
});

Thread consumer = new Thread(() =>
{
while (running)
{
if (q.Count > 0)
{
Guid g = (Guid)q.Dequeue();
Console.Write(g.ToString() + " ");
}
else
{
Console.Write(" . ");
}
Thread.Sleep(1);
}
});
consumer.IsBackground = true;

consumer.Start();
producer1.Start();
producer2.Start();

Console.ReadLine();

running = false;
}
}

关于C# 线程和队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/794249/

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