不为空的空对象

发布于 2024-09-01 02:44:07 字数 600 浏览 2 评论 0原文

我使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紙鸢 2024-09-08 02:44:07

锁定 myObject 意味着您锁定了 myObject 引用的对象。如果另一个线程更改了 myObject 的值,那么它就是一个没有人锁定的新对象。

对于锁,我建议您声明仅用于锁定的特定对象,例如:

private static readonly object MyLock = new object();

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:

private static readonly object MyLock = new object();
万水千山粽是情ミ 2024-09-08 02:44:07

在生产者线程中声明

public static object LockObject = new object();

执行如下操作:

lock(LockObject)
{
myObject.Data = ....
}

在消费者线程中声明执行如下操作:

lock(LockObject)
{
    if(myObject.Data == null)
    {
       Console.WriteLine("Null Object") // <-- Breakpoint here
    }
    else
    {
    // Do something
    }   
}

这应该可以帮助您。

Declare

public static object LockObject = new object();

in producer thread do something like this:

lock(LockObject)
{
myObject.Data = ....
}

and in consumer thread do something like this:

lock(LockObject)
{
    if(myObject.Data == null)
    {
       Console.WriteLine("Null Object") // <-- Breakpoint here
    }
    else
    {
    // Do something
    }   
}

This should help you out.

顾冷 2024-09-08 02:44:07

使用静态对象进行锁定

Use static object for lock

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文