Поделиться через


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 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 метод объекта (или IDisposableAsync метод объекта DisposeDisposeAsync), и вы пытаетесь получить доступ к члену экземпляра, который получает или задает состояние объекта. В следующем примере показано, что возникает 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*?displayProperty=nameWithType>.

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

В большинстве случаев это исключение приводит к ошибке разработчика. Вместо обработки ошибки в try/catch блоке следует исправлять ошибку, как правило, путем повторного создания объекта.

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

Имя Описание
ObjectDisposedException(SerializationInfo, StreamingContext)
Устаревшие..

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

ObjectDisposedException(String, Exception)

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

ObjectDisposedException(String, String)

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

ObjectDisposedException(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 объект с именем параметра и дополнительными сведениями об исключении.

GetType()

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

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

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

(Унаследовано от Object)
ThrowIf(Boolean, Object)

Создает исключение, ObjectDisposedException если указано conditiontrue.

ThrowIf(Boolean, Type)

Создает исключение, ObjectDisposedException если указано conditiontrue.

ToString()

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

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

События

Имя Описание
SerializeObjectState
Устаревшие..

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

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

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

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