不为空的空对象
我使用 2 个线程来充当使用双队列的生产者/消费者 (http://www .codeproject.com/KB/threads/DoubleQueue.aspx)。有时在我的第二个线程中,我得到一个 NULL 对象,但它不应该是我在第一个线程中填充的对象。
我尝试了这个:
if(myObject.Data == null)
{
Console.WriteLine("Null Object") // <-- Breakpoint here
}
当我的断点命中时,我可以观察 myObject.Data 并且它确实是 NULL,但是当我点击 F10 然后转到下一行(即 }
)时 myObject.Data 是不 NULL。 我之前还给myObject加了锁
如果......
以确保没有人会使用这个对象。
这怎么可能?我能做什么?
I use 2 threads to act like a produce/consumer using double queue (http://www.codeproject.com/KB/threads/DoubleQueue.aspx). Sometimes in my 2nd thread, I get an object that is NULL but it should not be as I filled it in the first thread.
I tried this:
if(myObject.Data == null)
{
Console.WriteLine("Null Object") // <-- Breakpoint here
}
When I my break point hits, I can watch myObject.Data and indeed it's NULL, but when I hit F10 and then go to the next line (which is }
) myObject.Data is not NULL.
I also added a lock on myObject before
if ....
to be sure that no one whould use this object.
How is that possible and what can I do ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
锁定 myObject 意味着您锁定了 myObject 引用的对象。如果另一个线程更改了 myObject 的值,那么它就是一个没有人锁定的新对象。
对于锁,我建议您声明仅用于锁定的特定对象,例如:
Locking on myObject means you're locking on the object myObject refers to. If another thread changes the value of myObject, it's a new object that no one is locking on.
For locks, I advise you declare specific object you only use for locking, for instance:
在生产者线程中声明
执行如下操作:
在消费者线程中声明执行如下操作:
这应该可以帮助您。
Declare
in producer thread do something like this:
and in consumer thread do something like this:
This should help you out.
使用静态对象进行锁定
Use static object for lock