由于对象的当前状态,操作无效。

7
有时候,当运行Mono .NET应用程序时(似乎与输入数据无关,因为它不会改变),我会遇到以下情况:当尝试从一个非空队列中Dequeue元素时(我先检查其Count),会抛出异常:
Unhandled Exception: System.InvalidOperationException: Operation is not valid due to the current state of the object at System.Collections.Generic.Queue1[DBWorkItem].Peek ()[0x00000] at System.Collections.Generic.Queue1[DBWorkItem].Dequeue () [0x00000] at DBProcessor.process (System.Object q) [0x0006b] in <...>
虽然我肯定可以捕获这个异常,但是元素已经被Dequeue并且丢失了。是否还有其他人遇到过这种行为?

你是否从多个线程访问此队列? - Adam Robinson
1个回答

5

您是否有多个线程使用此队列?当您检查计数时,它可能是非空的,但当您尝试查看项目时,则为空。

如果您有一个简短但完整的程序来演示问题,我们可以确定。当然,这可能是Mono的一个bug,尽管我的经验是系统框架通常比调用它们的代码更加稳健。


我确实使用了多个线程,但是每个线程都有自己的队列(包含要针对数据库执行的工作项),所以这不应该是一个问题。不过,我会尝试调查一下。不幸的是,代码太复杂了,无法在此处发布... - DBa
@DBa:然后拿起代码,一直敲打它,直到它不再太复杂而无法在这里发布。你说每个线程都有自己的队列,你有多确定这确实是情况?这可能是意图,但如果两个线程正在检查同一个队列,那就可能是问题所在。 - Jon Skeet
@DBa,你解决了这个问题吗?有更新吗?感谢您的帮助!谢谢! - Tate
@JonSkeet 我也遇到了同样的异常。代码在Mono上的MVC5应用程序中。代码:https://gist.github.com/anonymous/8feb761869d5d47ce140 - user2609980
解决方案是使用 ConcurrentQueueTryDequeue(out T result) 方法。可能与 Razor 中的线程有关? - user2609980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接