2010-05-10 6 views
2

Я использую 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 перед тем

если ....

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

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

+0

Что вы делаете? –

ответ

8

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

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

private static readonly object MyLock = new object(); 
+1

Действительно - всегда лучше использовать шкафчик. См. Страницу Jon Skeet на многопоточности C#: http://www.yoda.arachsys.com/csharp/threads/ –

2

Объявить

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

Статический объект для блокировки

Смежные вопросы