Нулевой объект, который не является нулевым - PullRequest
2 голосов
/ 10 мая 2010

Я использую 2 потока, чтобы действовать как производитель / потребитель, используя двойную очередь (http://www.codeproject.com/KB/threads/DoubleQueue.aspx). Иногда в моем 2-м потоке я получаю объект NULL, но он не должен быть таким, каким я его заполнил в первом потоке .

Я пробовал это:

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

Когда я достигаю точки останова, я могу смотреть myObject.Data, и действительно, он равен NULL, но когда я нажимаю F10, а затем перехожу к следующей строке (которая }), myObject.Data равен , а не НОЛЬ. Я также добавил блокировку на myObject до

если ....

чтобы быть уверенным, что никто не будет использовать этот объект.

Как это возможно и что я могу сделать?

Ответы [ 3 ]

8 голосов
/ 10 мая 2010

Блокировка на myObject означает, что вы блокируете объект, на который ссылается myObject. Если другой поток изменяет значение myObject, это новый объект, к которому никто не привязывается.

Для блокировок я советую вам объявить конкретный объект, который вы используете только для блокировки, например:

private static readonly object MyLock = new object();
2 голосов
/ 10 мая 2010

Declare

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
    }   
}

Это должно помочь вам.

0 голосов
/ 10 мая 2010

Использовать статический объект для блокировки

...