System objectdisposedexception доступ к закрытому файлу невозможен

Обновлено: 05.10.2022

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

Поток мог быть закрыт за пределами этого кода, и это исключение все равно возникло бы?

@PhilipDaubmeier - вы должны расширить это до ответа, прежде чем это сделает кто-то другой. Это правильный вопрос, который, скорее всего, не будет закрыт, и на него нужен ответ. Ты был первым. Возьми кредит, мужик!

Что-то или кто-то называется Close() или Dispose(). Каково ваше определение «внутреннего» и «внешнего» кода? И какое это имеет значение?

Поэтому я сделаю свой комментарий ответом: да, поток с таким же успехом может быть закрыт из-за пределов вашего кода, поэтому убедитесь, что вы проверяете наличие файла System.ObjectDisposedException .

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

The stream could have been closed outside of this code and this exception would still occur?

да. Например. Это может произойти, если вы оберните поток в другой поток и избавитесь от потока «оболочки». Многие реализации избавляются от потока, который они оборачивают.

either in a using or by calling dispose.

Также имейте в виду, что для объектов, которые имеют Close() метод, такой как Stream , Close и Dispose обычно выполняют одну и ту же функцию. Закрытие потока также удаляет его.

Эта ошибка также может произойти, если requestLengthDiskThreshold меньше размера файла, который вы пытаетесь загрузить/обработать через поток. Это определено в вашем web.config:

Если вы посмотрите на объяснение второго параметра здесь:

вы увидите, что он устанавливает порог буферизации входного потока (в килобайтах). Значение по умолчанию — 80 КБ, поэтому, если у вас не установлено это значение, и вы пытаетесь, например, загрузить файл размером более 80 КБ с помощью ajax, вы получите исключение System.ObjectDisposedException, поскольку поток будет закрыт после достижения порогового предела. .


и проблема заключается в том, что когда я закрываю окно 2 формы и нажимаю заново чтобы его открыть и заполнить данными у меня выскакивает исключение, что System.ObjectDisposedException: "Доступ к ликвидированному объекту невозможен."
Скрываю ту другую форму так: MainForm.r1.Hide(); и непонятно почему ссылка на объект уничтожается.

НО если создавать при нажатии каждый раз новый объект, то все ок, и я этим и воспользовался, но не понятно почему созданный объект другой формы в основном классе основной формы уничтожается при скрытии той другой формы.

Простой 21 комментарий

byte916

TosterModerator

3. В процессе создания вопроса пользователь Сервиса обязан:
3.8. Использовать для демонстрации фрагментов кода только специальный тег < code>

Андрей, вторая форма уже создана, в ней находится только датагрид готовый для заполнения, и из первой я создаю ссылку на 2 и вношу данные в датагрид. Я не создаю вторую форму программно.

JohnnyGat

KryptoPython, слишком сумбурно и бессвязно сформулированный вопрос.
Что за класс "Result"?
Почему "r" нигде не используется?
Откуда появилась "r1"?

Johnny Gat, извините я исправил r = r1; Result это название формы конструктор и класс Result.cs в нем я ничего не пишу, просто в конструкторе создаю гоотвый датагрид для заполнения

Johnny Gat, проблема в том чот когда я открываю 2 форму, как раз таки Result из формы main(основная), он открывается и все норм, но когда я скрываю(то есть она висит в фоне не уничтожилась) форму Result, и заново открываю ее через форму main, класс также main, то уменя выкидывается исключение что объекта больше нет, то есть получается, что при скрытии формы объект r1 созданный в классе main уничтожился вот и непоянтно почему так происходит, и куда он девается.

JohnnyGat

KryptoPython, проблема в том что у вас и в коде и в формулировании вопроса - сумбур.
Вы говорите что "r1" объект пустого класса (уже бред), потом обращаетесь к нему как к форме "r1.Show();", а затем обращаетесь к нему как к элементу на форме "MainForm.r1". Полный бред.

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Исключение, которое выбрасывается при выполнении операции над удаленным объектом.

Методы

Определяет, равен ли указанный объект текущему объекту.

При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений.

Служит хэш-функцией по умолчанию.

Извлекает объект SerializationInfo с именем параметра и дополнительной информацией об исключении.

При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.

Возвращает тип среды выполнения текущего экземпляра.

Создает неполную копию текущего объекта Object.

Создает и возвращает строковое представление текущего исключения.

Примеры

Этот код выводит следующие результаты:

Свойства

Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении.

Получает или задает ссылку на файл справки, связанный с этим исключением.

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.

Возвращает экземпляр класса Exception, который вызвал текущее исключение.

Возвращает имя удаленного объекта.

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.

Получает строковое представление непосредственных кадров в стеке вызова.

Возвращает метод, создавший текущее исключение.

Remarks

An ObjectDisposedException is thrown when you try to access a member of an object that implements the IDisposable interface or IAsyncDisposable interface, and that object has been disposed. Typically, this exception is caused by one of the following conditions:

You've called an IDisposable object's Dispose method (or an IDisposableAsync object's DisposeAsync method), and you're trying to access an instance member that gets or sets the object's state. The following example illustrates the ObjectDisposedException that is thrown when you try to reset the frequency of timer notifications after you call the Timer.Dispose method.

You've called an object's Close method, and you're trying to access an instance member that gets or sets the object's state. Often, the Close method provides a type's public implementation of the IDisposable.Dispose method. The same is true for CloseAsync and .

You've called an object's Dispose or DisposeAsync methods multiple times. Typically, this doesn't throw an exception. However, depending on how a type implements IDisposable.Dispose or IAsyncDisposable.DisposeAsync, it may not allow multiple calls to that method.

In most cases, this exception results from developer error. Instead of handling the error in a try / catch block, you should correct the error, typically by reinstantiating the object.

Конструкторы

Инициализирует новый экземпляр класса ObjectDisposedException с сериализованными данными.

Инициализирует новый экземпляр класса ObjectDisposedException строкой, содержащей имя удаленного объекта.

Constructors

Initializes a new instance of the ObjectDisposedException class with serialized data.

Initializes a new instance of the ObjectDisposedException class with a string containing the name of the disposed object.

Initializes a new instance of the ObjectDisposedException class with a specified error message and a reference to the inner exception that is the cause of this exception.

Initializes a new instance of the ObjectDisposedException class with the specified object name and message.

Examples

The following example demonstrates an error that causes the ObjectDisposedException exception to be thrown.

This code produces the following output:

Methods

Determines whether the specified object is equal to the current object.

When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

Serves as the default hash function.

Retrieves the SerializationInfo object with the parameter name and additional exception information.

When overridden in a derived class, sets the SerializationInfo with information about the exception.

Gets the runtime type of the current instance.

Creates a shallow copy of the current Object.

Creates and returns a string representation of the current exception.

События

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

The exception that is thrown when an operation is performed on a disposed object.

Properties

Gets a collection of key/value pairs that provide additional user-defined information about the exception.

Gets or sets a link to the help file associated with this exception.

Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

Gets the Exception instance that caused the current exception.

Gets the message that describes the error.

Gets the name of the disposed object.

Gets or sets the name of the application or the object that causes the error.

Gets a string representation of the immediate frames on the call stack.

Gets the method that throws the current exception.

Комментарии

Возникает ObjectDisposedException при попытке получить доступ к члену объекта, реализующего IDisposable интерфейс или IAsyncDisposable интерфейс, и этот объект был удален. Как правило, это исключение вызвано одним из следующих условий:

Вы вызвали IDisposable метод объекта Dispose (или IDisposableAsync метод объекта DisposeAsync ) и пытаетесь получить доступ к члену экземпляра, который получает или задает состояние объекта. В следующем примере показано, что возникает ObjectDisposedException при попытке сбросить частоту уведомлений таймера после вызова Timer.Dispose метода.

Вы вызвали метод объекта и пытаетесь получить доступ к члену экземпляра Close , который получает или задает состояние объекта. Close Часто этот метод предоставляет общедоступную реализацию IDisposable.Dispose метода типа. То же самое верно для CloseAsync и .

Вы несколько раз вызывали Dispose объект или DisposeAsync методы. Как правило, это не приводит к возникновению исключения. Однако в зависимости от того, как реализуется IDisposable.Dispose тип или IAsyncDisposable.DisposeAsync, он может не разрешать несколько вызовов этого метода.

3 Answers 3

So I will make my comment an answer: Yes, a stream could just as well be closed from outside your code, so make sure you check for a System.ObjectDisposedException .

There are several occasions this could happen: imagine for example a stream associated with a network connection and the connection is suddenly interrupted. Depending on the implementation this could close the stream and throw that particular exception if the stream is accessed.

The stream could have been closed outside of this code and this exception would still occur?

Yes. For example - This can happen if you wrap a stream within another stream, and dispose of the "wrapper" stream. Many implementations dispose of the stream they are wrapping.

If you then try to write to the "wrapped" stream, you'll receive this error message.

either in a using or by calling dispose.

Also realize that, for objects which have a Close() method, such as Stream , Close and Dispose typically perform the same function. Closing a stream also disposes of it.

This error can also happen if the requestLengthDiskThreshold is smaller than the size of the file you are trying to upload/handle via the stream. This is defined in your web.config:

you will see that it sets the input-stream buffering threshold (in kilobytes). The default value is 80KB so if you don't have this value set and you try, for example, to ajax upload the file bigger than 80KB you will get the System.ObjectDisposedException exception since the stream will be closed once the threshold limit is met.

Events

Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

Is it true that this does not necessarily mean the stream has been disposed of by code - either in a using or by calling dispose.

The stream could have been closed outside of this code and this exception would still occur?

@PhilipDaubmeier - you should expand that to an answer before somebody else does. This is a valid question that will likely not get closed, and it needs an answer. You were first. Take the credit, man!

Something or someone called Close() or Dispose(). What is your definition of 'inside' and 'outside' code? And what does it matter?

Читайте также: