Элементы, добавленные в ConcurrentDictionary, сразу же переходят в состояние зомби.

Я пытаюсь быстро собрать небольшую программу, используя Alchemy Websockets, которая использует коллекцию ConcurrentDictionary в своих примерах.

В коде, который я написал, я пытаюсь добавить нового клиента в ConcurrentDictionary. Я заметил, что мой сценарий дает сбой в других областях при попытке доступа к этому клиенту, и сузил его до элементов, которые я добавляю в ConcurrentDictionary, немедленно переходят в состояние «зомби».

Вот тестовый код, где я добавляю клиента:

Client test = new Client(ctx, sessId);
Clients.TryAdd(test, String.Empty);
Console.WriteLine ("Adding new client: " + sessId);

Если я использую свой отладчик для взлома этой области, я вижу, что «тест» содержит правильную информацию о клиенте, но сразу после добавления его в коллекцию «Клиенты» он говорит: «Объект находится в состоянии зомби. (Исключение из HRESULT: 0x8013134F)» .

Словарь объявлен в моем классе как таковой:

protected ConcurrentDictionary<Client, string> Clients = new ConcurrentDictionary<Client, string>();

Я знаю, что, вероятно, делаю что-то глупо очевидное, но что дает?


person DWilliams    schedule 30.07.2012    source источник
comment
Согласно ошибке в Mono bugzilla, это может быть просто ошибка в окно отладчика. Вы уверены, что это действительно вызывает у вас проблемы?   -  person svick    schedule 30.07.2012
comment
Я почти уверен, что это вызывает проблему. Впервые я обнаружил эту проблему, когда установленное мной условное выражение всегда приравнивалось к ложному, даже когда я знал, что оно должно быть истинным. Прерывание сравнения показывает правильную строку в одной из моих переменных сравнения, а другая сторона является членом моего ConcurrentDictionary с вышеупомянутой проблемой. Когда я использую Console.WriteLine() для зомби-объекта, который должен содержать мои данные, он также просто выводит пустую строку, поэтому я предполагаю, что это свидетельствует о том, что это не ошибка отладчика.   -  person DWilliams    schedule 30.07.2012
comment
Хорошо, в таком случае не могли бы вы опубликовать краткий, но полный пример программы, показывающей эту проблему?   -  person svick    schedule 30.07.2012


Ответы (1)


Если вы пришли к выводу, что элементы, попадающие в ConcurrentDictionary, переходят в состояние зомби, вы предполагаете, что любой объект делает это, верно? Затем попробуйте проверить это предположение, написав меньшую программу, сокращенный тестовый пример, который вообще не связан с классом Client или с библиотекой WebSockets.

Если это все еще вызывает у вас проблему, поздравляю, теперь вы сужаете проблему. Второй шаг, который я бы сделал, - это взять вашу меньшую программу и попытаться выполнить ее внутри MS.NET (не Mono). Если это работает в MS.NET, а не в Mono, я бы зарегистрировал ошибку в системе отслеживания ошибок Mono: http://bugzilla.xamarin.com/.

Если же ваша программа не работает и в MS.NET, возможно, вы что-то делаете не так!

person knocte    schedule 30.07.2012
comment
Оказывается, вы, ребята, были правы. Я нашел проблему в другом месте в моем коде. Я попытался сделать отдельный проект, чтобы проверить это, и действительно кажется, что каждый объект, добавленный в любой ConcurrentDictionary, отображается как объект-зомби в MonoDevelop, даже если он в порядке. - person DWilliams; 31.07.2012