Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/89: Рейтинг темы: голосов - 89, средняя оценка - 4.82
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3

Доступ к ликвидированному объекту невозможен

04.02.2016, 10:52. Показов 17423. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Никак не могу избавиться от ошибки:
System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен.

Вроде, все Dispose и using(xxx x = new xxx()) {} поудалял.
Что это еще может быть?
И как можно отследить эту ошибку. Дело в том, что она возникает не совсем предсказуемо. Например, в TreeView:
C#
1
2
3
4
5
6
7
8
ReBuildNode(data, Nodes[0]); //здесь нет ошибки
 
 
private void ReBuildNode(MyData data, TreeNode node)
{
    node.Tag = data;        //здесь нет ошибки
    node.Text = data.Name;  // здесь ошибка
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2016, 10:52
Ответы с готовыми решениями:

Доступ к ликвидированному объекту невозможен
Есть два метода, один из которых запускается в новом потоке. private void _Process() { try { ...

Доступ к ликвидированному объекту невозможен
Всем доброго времени суток. Вообщем скажу сразу речь будет о ддосе но я делаю это исключительно в целях тестирования своих игровых...

System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен
Дела обстоят так. Есть у меня в классе GameForm поле public System.Windows.Forms.Panel RenderPanel; В этой панельке я собираюсь...

16
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
04.02.2016, 12:09
Serg34, что представляет из себя тип MyData?
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.02.2016, 13:12  [ТС]
OwenGlendower, если коротко, то MyData это class, одним из свойств которого является string Name и он не реализует IDisposeable(если Вы об этом).
Или что именно в типе MyData может быть не так, просто их у меня несколько и они довольно таки сложные, чтобы так просто ответить
Но они все в памяти нормально хранятся, сериализуются и десериализуются и т.д.

Добавлено через 6 минут
Вот стэк вызовов при ошибке (может, поможет):
System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен.
Имя объекта: "TreeViewModel".
в System.Windows.Forms.Control.CreateHandl e()
в System.Windows.Forms.TreeView.CreateHand le()
в System.Windows.Forms.Control.get_Handle( )
в System.Windows.Forms.TreeNode.UpdateNode (Int32 mask)
в System.Windows.Forms.TreeNode.set_Text(S tring value)
в FSImark.Controls.TreeViewModel.ReBuildNo deFromFolder[TFolder](TFolder cFolder, TreeNode folderNode)
в FSImark.Controls.TreeViewModel.ReBuild(O bject sender, EventArgs e)
в System.EventHandler.Invoke(Object sender, EventArgs e)
в FSImark.Bll.Model.OnChanged()
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
04.02.2016, 13:30
Serg34, изучи откуда берется TreeNode. Похоже проблема в нем. Присвоение Tag не дает ошибки т.к. оно не привязано к отображению в отличие от Text
1
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.02.2016, 14:25  [ТС]
Вроде, понял! Дело, скорее всего, действительно в объекте.
Точнее в его отсутствии.
Ошибка выскакивает после того, как я заменяю один MyData(в моем проекте это TFolder) на другой в коллекции типа List<MyData>.
Вот код в команде UndoRedo:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public void Execute()
        {
            targetFoldersOwner.Remove(prevValue);
            targetFoldersOwner.Insert(index, value);
            Model.OnChanged();
        }
 
        public void UnExecute()
        {
            targetFoldersOwner.Remove(value);
            targetFoldersOwner.Insert(index, prevValue);
            Model.OnChanged();
        }
и тогда на строчке
C#
1
node.Tag = data;        //здесь нет ошибки
в node.Tag лежит еще старый объект (prevValue), но он не может быть ликвидирован, он хранится как минимум в команде и обращения к ней нет, по крайней мере явных(с моей стороны) нет
Да и сразу никакой ошибки не выскакивает. Ошибки появляются после следующего перестроения контрола. Странно это как-то
0
675 / 421 / 44
Регистрация: 09.07.2012
Сообщений: 1,419
04.02.2016, 14:26
Возможно в параметре вообще null передается, проверяйте аргументы в методе перед их использованием.
type = null не выдается ошибки, если type - ссылочный.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
04.02.2016, 14:39
Цитата Сообщение от Serg34 Посмотреть сообщение
Да и сразу никакой ошибки не выскакивает. Ошибки появляются после следующего перестроения контрола. Странно это как-то
Значит так у тебя алгоритм организован. Изучи более внимательно свой код, пройдись отладчиком и разберись.

Цитата Сообщение от Dywar Посмотреть сообщение
Возможно в параметре вообще null передается
Врядли. В этом случае было бы NullReferenceException
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.02.2016, 14:40  [ТС]
TreeNodes берутся рекурсией из Nodes[0], который не удаляется никогда.

Правда, может, я не правильно удаляю лишние узлы? (узлы удаленных данных)
Делаю так:
C#
1
2
3
4
5
6
7
int inFolderCount = cFolder.CFolders.Count;
 
            //delete unnecessary folder's node
            while (folderNode.Nodes.Count > inFolderCount && folderNode.Nodes[inFolderCount].Tag is CFolder)
            {
                folderNode.Nodes.Remove(folderNode.Nodes[inFolderCount]);
            }
Доберусь до Visual Studio проверю. По крайней мере причину я понял, спасибо
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.02.2016, 15:30
Serg34, какая разница, что ты удалял? Dispose фиксирует время вызова деструктора, но он может быть вызван и автоматически. Диспоз просто делает это раньше, его отсутствие не отменяет вызов деструктора.

Где-то идет обращение к IDisposable, можно поставить кнопочку "First change exception" на это исключение и ловить, какой объект был задиспозен. А потом смотреть, где и почему.
1
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.02.2016, 16:33  [ТС]
Psilon, я имел ввиду, что Remove, может, недостаточно в данном случае или еще что-то особенное нужно для удаления узла... Иначе почему такое происходит...
За "First change exception" спасибо, не знал
0
675 / 421 / 44
Регистрация: 09.07.2012
Сообщений: 1,419
04.02.2016, 17:30
Включите правила кода Microsoft на полную катушку на своем проекте (настройки проекта, правила кода).
И 50 на 50 он сразу вам укажет где возможно у вас объект используется когда он уже может быть ликвидирован.

Я узнал о таких моментах при инициализации объекта в месте объявления, когда объявляемый член должен освободить ресурсы. Например:
var variable = new SomeType { Name = "Username", Age = 29, .... = ... };
CA номер забыл, но даже в таких местах могут быть проблемы.
2
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.02.2016, 18:01  [ТС]
Dywar, Самое смешное, что именно с этого и началась моя проблема
Включил я все правила, выполнил все предлагаемые изменения по поводу Dispose и теперь разгребаю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.02.2016, 19:32
Serg34, ну как раз-таки верно. Раньше баг был плавающий (он бы происходил только в момент, когда сборщик удаляет объект до того, как к нему идет обращение), а теперь он всплыл.

Расскажу одну байку. Как-то раз на автовазе заказали инструмент, который мог бы определять брак. Сделали ТЗ, в котором описали супер-свойства этого прибора, инженеры долго-долго ломали голову, экспериментировали, но сделать смогли. Получился супер-точный инструмент, который находил даже самые заковыристые проблемы, которые могли спать месяцами в готовой продукции. Завезли на завод, поставили, бах - больше 30% продукции машиной автоматически отбраковывается. Что автоваз сделал? Тщательнее начали принимать материалы? А хрен там, сказали "настройте ваш прибор так, чтобы она брак пропускала в 90% случаев". И так с тех пор он там и стоит, показывая брак в районе погрешности, потому что никому не нужно было отбраковывать такой огромный объем продукции.

Мораль думаю уловите сами.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
05.02.2016, 00:34  [ТС]
Каюсь - сам виноват, правила Microsoft тут ни при чем)))
Я создал юзерконтрол в главной форме и использовал экземпляр этого же юзерконтрола в диалоге,
а у него(юзерконтрола) подписка на изменение модели
Соответственно при уничтожении диалога ошибка.
Все осложнялось тем, что я был в полной уверенности, что отлаживаю экземпляр юзерконтрола в главной форме, и еще ошибка появлялась не на первом обращении:
Цитата Сообщение от Serg34 Посмотреть сообщение
C#
1
node.Tag = data; //здесь нет ошибки
Кстати, это я до сих пор не понял. Возможно, отладка так настроена

А мораль поддерживаю!!! Я тоже за перфекционизм
Всем Спасибо!!!
0
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
05.02.2016, 00:44
C#
1
2
3
4
5
6
7
8
9
10
ReBuildNode(data, Nodes[0]); //здесь нет ошибки
 
private void ReBuildNode(MyData data, TreeNode node)
{
    if (data != null)  // проверка
    {
        node.Tag = data;
        node.Text = data.Name;
    }
}
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
05.02.2016, 08:23  [ТС]
Dam33,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Врядли. В этом случае было бы NullReferenceException
Добавлено через 4 минуты

Не по теме:

Опять придется добавлять все Dispose и using(xxx x = new xxx()) {} :D



Добавлено через 4 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Присвоение Tag не дает ошибки т.к. оно не привязано к отображению в отличие от Text
А может эта тема как-то с этим связана?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
05.02.2016, 12:24
Цитата Сообщение от Serg34 Посмотреть сообщение
А может эта тема как-то с этим связана?
Не думаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2016, 12:24
Помогаю со студенческими работами здесь

System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен
Смастерил Irc Client, но при закрытии формы с чатом вылетает System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен...

Ошибка при закрытии сокета "Доступ к ликвидированному объекту невозможен"
Здравтсвуйте, когда закрываю сокет - появляется ошибка: RecieveData Error. Досутп к ликвидированному обьекту невозможен. Имя объекта...

Доступ к ликвидированному объекту невозможен
Есть сервер на C# + клиент на C# + клиент на Java Android. Сервер асинхронный. Суть вот в чем: андройд должен отправлять данные на сервер...

Ошибка "Доступ к ликвидированному объекту невозможен"
Ошибка &quot;Доступ к ликвидированному объекту невозможен. Имя объекта: &quot;Form&quot;.&quot; в чем проблема не пойму

Если форма вдруг закрылась то поток все равно долбится к ликвидированному объекту
readThreed = new Thread(new ThreadStart(RunClient)); readThreed.Start(); } public void RunClient() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 19.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru