ObjectDisposedException Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Исключение, которое выбрасывается при выполнении операции над удаленным объектом.
public ref class ObjectDisposedException : InvalidOperationException
public class ObjectDisposedException : InvalidOperationException
[System.Serializable]
public class ObjectDisposedException : InvalidOperationException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectDisposedException : InvalidOperationException
type ObjectDisposedException = class
inherit InvalidOperationException
[<System.Serializable>]
type ObjectDisposedException = class
inherit InvalidOperationException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjectDisposedException = class
inherit InvalidOperationException
Public Class ObjectDisposedException
Inherits InvalidOperationException
- Наследование
- Наследование
- Атрибуты
Примеры
В следующем примере показана ошибка, которая приводит ObjectDisposedException
к возникновению исключения.
using namespace System;
using namespace System::IO;
int main()
{
MemoryStream^ ms = gcnew MemoryStream( 16 );
ms->Close();
try
{
ms->ReadByte();
}
catch ( ObjectDisposedException^ e )
{
Console::WriteLine( "Caught: {0}", e->Message );
}
}
using System;
using System.IO;
public class ObjectDisposedExceptionTest
{
public static void Main()
{
MemoryStream ms = new MemoryStream(16);
ms.Close();
try
{
ms.ReadByte();
}
catch (ObjectDisposedException e)
{
Console.WriteLine("Caught: {0}", e.Message);
}
}
}
open System
open System.IO
let ms = new MemoryStream 16
ms.Close()
try
ms.ReadByte()
|> ignore
with :? ObjectDisposedException as e ->
printfn $"Caught: {e.Message}"
Imports System.IO
Public Class ObjectDisposedExceptionTest
Public Shared Sub Main()
Dim ms As New MemoryStream(16)
ms.Close()
Try
ms.ReadByte()
Catch e As ObjectDisposedException
Console.WriteLine("Caught: {0}", e.Message)
End Try
End Sub
End Class
Этот код выводит следующие результаты:
Caught:
Cannot access a closed Stream.
Комментарии
Возникает ObjectDisposedException при попытке доступа к члену объекта, реализующего IDisposable интерфейс или IAsyncDisposable интерфейс, и этот объект был удален. Как правило, это исключение вызвано одним из следующих условий:
Вы вызвали
IDisposable
метод объектаDispose
(илиIDisposableAsync
метод объектаDisposeAsync
), и вы пытаетесь получить доступ к члену экземпляра, который получает или задает состояние объекта. В следующем примере показано, что возникает ObjectDisposedException при попытке сбросить частоту уведомлений таймера после вызова Timer.Dispose метода.using System; using System.Threading; public class Example { public static void Main() { Timer t = new Timer(TimerNotification, null, 100, Timeout.Infinite); Thread.Sleep(2000); t.Dispose(); t.Change(200, 1000); Thread.Sleep(3000); } private static void TimerNotification(Object obj) { Console.WriteLine("Timer event fired at {0:F}", DateTime.Now); } } // The example displays output like the following: // Timer event fired at Monday, July 14, 2014 11:54:08 AM // // Unhandled Exception: System.ObjectDisposedException: Cannot access a disposed object. // at System.Threading.TimerQueueTimer.Change(UInt32 dueTime, UInt32 period) // at Example.Main()
open System open System.Threading let timerNotification _ = printfn $"Timer event fired at {DateTime.Now:F}" let t = new Timer(timerNotification, null, 100, Timeout.Infinite) Thread.Sleep 2000 t.Dispose() t.Change(200, 1000) |> ignore Thread.Sleep 3000 // The example displays output like the following: // Timer event fired at Monday, July 14, 2014 11:54:08 AM // // Unhandled Exception: System.ObjectDisposedException: Cannot access a disposed object. // at System.Threading.TimerQueueTimer.Change(UInt32 dueTime, UInt32 period) // at <StartupCode$fs>.main()
Imports System.Threading Module Example Public Sub Main() Dim t As New Timer(AddressOf TimerNotification, Nothing, 100, Timeout.Infinite) Thread.Sleep(2000) t.Dispose() t.Change(200, 1000) Thread.Sleep(3000) End Sub Private Sub TimerNotification(obj As Object) Console.WriteLine("Timer event fired at {0:F}", Date.Now) End Sub End Module ' The example displays output like the following: ' Timer event fired at Monday, July 14, 2014 11:54:08 AM ' ' Unhandled Exception: System.ObjectDisposedException: Cannot access a disposed object. ' at System.Threading.TimerQueueTimer.Change(UInt32 dueTime, UInt32 period) ' at Example.Main()
Вы вызвали метод объекта
Close
и пытаетесь получить доступ к члену экземпляра, который получает или задает состояние объекта. Часто методClose
предоставляет общедоступную реализацию IDisposable.Dispose метода типа. То же самое верно дляCloseAsync
и<xref:System.IAsyncDisposable.DisposeAsync%2A?displayProperty=nameWithType>
.Вы несколько раз вызывали объект
Dispose
илиDisposeAsync
методы. Как правило, это не приводит к возникновению исключения. Однако в зависимости от того, как реализуется IDisposable.Dispose тип или IAsyncDisposable.DisposeAsync, он может не разрешать несколько вызовов этого метода.
В большинстве случаев это исключение приводит к ошибке разработчика. Вместо обработки ошибки в try
/catch
блоке следует исправить ошибку, как правило, путем повторного создания объекта.
Конструкторы
ObjectDisposedException(SerializationInfo, StreamingContext) |
Инициализирует новый экземпляр класса ObjectDisposedException с сериализованными данными. |
ObjectDisposedException(String) |
Инициализирует новый экземпляр класса ObjectDisposedException строкой, содержащей имя удаленного объекта. |
ObjectDisposedException(String, Exception) |
Инициализирует новый экземпляр класса ObjectDisposedException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение. |
ObjectDisposedException(String, String) |
Инициализирует новый экземпляр класса ObjectDisposedException указанными именем объекта и сообщением. |
Свойства
Data |
Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении. (Унаследовано от Exception) |
HelpLink |
Получает или задает ссылку на файл справки, связанный с этим исключением. (Унаследовано от Exception) |
HResult |
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению. (Унаследовано от Exception) |
InnerException |
Возвращает экземпляр класса Exception, который вызвал текущее исключение. (Унаследовано от Exception) |
Message |
Возвращает сообщение с описанием ошибки. |
ObjectName |
Возвращает имя удаленного объекта. |
Source |
Возвращает или задает имя приложения или объекта, вызывавшего ошибку. (Унаследовано от Exception) |
StackTrace |
Получает строковое представление непосредственных кадров в стеке вызова. (Унаследовано от Exception) |
TargetSite |
Возвращает метод, создавший текущее исключение. (Унаследовано от Exception) |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetBaseException() |
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений. (Унаследовано от Exception) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Извлекает объект SerializationInfo с именем параметра и дополнительной информацией об исключении. |
GetObjectData(SerializationInfo, StreamingContext) |
При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении. (Унаследовано от Exception) |
GetType() |
Возвращает тип среды выполнения текущего экземпляра. (Унаследовано от Exception) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ThrowIf(Boolean, Object) |
Создает исключение, ObjectDisposedException если указанный параметр имеет |
ThrowIf(Boolean, Type) |
Создает исключение, ObjectDisposedException если указанный параметр имеет |
ToString() |
Создает и возвращает строковое представление текущего исключения. (Унаследовано от Exception) |
События
SerializeObjectState |
Является устаревшей.
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении. (Унаследовано от Exception) |