C# 如何使锁等待释放?
我使用Lock访问队列,但其中一种情况似乎从未执行Lock中的代码块 我有一个线程每几秒钟执行一次下面的代码C# 如何使锁等待释放?,c#,multithreading,unity3d,C#,Multithreading,Unity3d,我使用Lock访问队列,但其中一种情况似乎从未执行Lock中的代码块 我有一个线程每几秒钟执行一次下面的代码 lock(queueLock){ while(queue.Count > 0){ doSomething(queue.Dequeue()); } } 另一个线程将根据I/O执行以下代码(不由时间间隔决定): 第二个永远无法执行锁内的代码。我已经尝试过使用调试器或打印,但这似乎只是在运行,在VS调试器的threads窗口中,当没有其他线程使用此队列
lock(queueLock){
while(queue.Count > 0){
doSomething(queue.Dequeue());
}
}
另一个线程将根据I/O执行以下代码(不由时间间隔决定):
第二个永远无法执行锁内的代码。我已经尝试过使用调试器或打印,但这似乎只是在运行,在VS调试器的threads窗口中,当没有其他线程使用此队列时,试图获取锁的线程似乎刚刚死亡
我没有使用.net,我在unity上编程,但在这种情况下,除了更新功能外,我没有使用任何unity特定的功能。尝试使用不带锁的线程安全。最后,问题不在于锁,实际上只是排队锁之前的一行代码,我将e从json转换到另一个类,结果抛出了一个unity没有向我显示的异常,但因为我从未在c#中使用多线程,所以我最终发现了错误的地方。共享完整的代码示例。可以在给定的代码段中识别问题。如果您只是因为队列而锁定,那么您知道有一个线程安全队列不需要使用锁定,对吗?或者我最喜欢的BlockingCollection@pm100,如果队列为空,为什么第一个调用会被阻塞?
while
不会执行,锁不会被释放吗?所以我不能使用ConcurrentQueue,因为它需要.NET Framework 4.6,正如我之前所说,它是Unity,所以我没有访问.NET Framework的权限。来源如下:您是否确保线程正在调用第二块代码?
lock(queueLock){
queue.Enqueue(input);
}