Вопрос к гуру многопоточности
От: CoderMonkey  
Дата: 25.10.17 15:35
Оценка:
Есть примерно такой код:

        static void SomeMethod()
        {
            var val = new SomeClass();
            Queue.Enqueue(val);
            Trace.WriteLine($"Queue: {Queue.Count}");
        }

        static readonly ConcurrentQueue<SomeClass> Queue = new ConcurrentQueue<SomeClass>();


И в результате получаем вывод:
Queue: 0


Как такое может происходить? А то у меня что-то ни одной идеи. Метод, в данном случае, вызывается ровно один раз.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: Вопрос к гуру многопоточности
От: hardcase Пират http://nemerle.org
Дата: 25.10.17 15:42
Оценка: 1 (1) +4
Здравствуйте, CoderMonkey, Вы писали:

CM>Как такое может происходить?


Между вызовами Enqueue и get_Count кто-то в соседнем потоке успел опустошить очередь.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Вопрос к гуру многопоточности
От: CoderMonkey  
Дата: 25.10.17 15:47
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Между вызовами Enqueue и get_Count кто-то в соседнем потоке успел опустошить очередь.


Других вариантов нет? Сам код корректен?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: Вопрос к гуру многопоточности
От: Слава  
Дата: 25.10.17 16:35
Оценка: -1
Здравствуйте, CoderMonkey, Вы писали:

H>>Между вызовами Enqueue и get_Count кто-то в соседнем потоке успел опустошить очередь.

CM>Других вариантов нет? Сам код корректен?

Хорошо бы на внутренность этого самого ConcurrentQueue посмотреть. Может там счётчик как-то своеобразно пересчитывается. Попробуйте вызвать IsEmpty, посмотреть, что он выдаст.
Re: Вопрос к гуру многопоточности
От: itslave СССР  
Дата: 25.10.17 16:41
Оценка: 5 (2) +1
Здравствуйте, CoderMonkey, Вы писали:

CM>Как такое может происходить? А то у меня что-то ни одной идеи. Метод, в данном случае, вызывается ровно один раз.


https://dotnetfiddle.net/1sImZf
Все работает as expected.
Попробуй

        static readonly ConcurrentQueue<SomeClass> InternalQueue = new ConcurrentQueue<SomeClass>();
        static readonly ConcurrentQueue<SomeClass> Queue {get {return InternalQueue;} }

И повесь брекпойнт/логи на Queue.get
И сразу увидишь кто мешает тебе жить.
Re[4]: ConcurrentQueue.cs
От: Qbit86 Кипр
Дата: 25.10.17 18:09
Оценка:
Здравствуйте, Слава, Вы писали:

С>Хорошо бы на внутренность этого самого ConcurrentQueue посмотреть.


https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Collections/Concurrent/ConcurrentQueue.cs
Глаза у меня добрые, но рубашка — смирительная!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.