ObjectDisposedException Class (System) (original) (raw)

Definition

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

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

Inheritance

Inheritance

Attributes

Examples

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

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

This code produces the following output:

Caught:
  Cannot access a closed Stream.

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:

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()  

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.

Applies to

See also