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
Наследование
Атрибуты

Примеры

В следующем примере показана ошибка, которая приводит 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 если указанный параметр имеет trueзначение condition .

ThrowIf(Boolean, Type)

Создает исключение, ObjectDisposedException если указанный параметр имеет trueзначение condition .

ToString()

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

(Унаследовано от Exception)

События

SerializeObjectState
Является устаревшей.

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

(Унаследовано от Exception)

Применяется к

См. также раздел