How Do I: 'System.ObjectDisposedException'

B

Brian

Hello all.

I have a simple application that I was using to test and understand
the System.Timers.Timer and noticed that when I stop the application,
on occasion, it throughs the following exception.

An exception of type 'System.ObjectDisposedException' occurred in
System.Windows.Forms.dll but was not handled in user code

Additional information: Cannot access a disposed object.

Should I just place the offending line in a Try Catch or set the timer
to nothing in FormClosing. Below is the code, real short.


Public Class formMain
Dim c As New Chronology
Dim WithEvents UpdateTmr As System.Timers.Timer
Dim StartTime As Date
Dim BlockWindowStart As Date
Dim BlockWindowEnd As Date



Private Sub formMain_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
UpdateTmr = New System.Timers.Timer
UpdateTmr.Interval = 1000
UpdateTmr.Enabled = True
StartTime = DateTime.Now
BlockWindowStart = StartTime.AddSeconds(10)
BlockWindowEnd = BlockWindowStart.AddSeconds(10)

End Sub


Private Sub UpdateTmr_Elapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs) Handles UpdateTmr.Elapsed
'Exception is thrown
here.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Me.Invoke(New delUpdateForm(AddressOf UpdateForm))
End Sub

Public Delegate Sub delUpdateForm()
Public Sub UpdateForm()
Label1.Text = Now
Dim x As DateTime = DateTime.Now
Dim tsw As TimeSpan = BlockWindowEnd - BlockWindowStart
Debug.Print("Block Window Value: " & tsw.Ticks)

Dim ts As TimeSpan = DateTime.Now - BlockWindowStart
Debug.Print(ts.Ticks)
Debug.Print(DateTime.Now >= BlockWindowStart And DateTime.Now
<= BlockWindowEnd)


End Sub
End Class
 
K

kimiraikkonen

Hello all.

I have a simple application that I was using to test and understand
the System.Timers.Timer and noticed that when I stop the application,
on occasion, it throughs the following exception.

An exception of type 'System.ObjectDisposedException' occurred in
System.Windows.Forms.dll but was not handled in user code

Additional information: Cannot access a disposed object.

Should I just place the offending line in a Try Catch or set the timer
to nothing in FormClosing. Below is the code, real short.

Public Class formMain
Dim c As New Chronology
Dim WithEvents UpdateTmr As System.Timers.Timer
Dim StartTime As Date
Dim BlockWindowStart As Date
Dim BlockWindowEnd As Date

Private Sub formMain_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
UpdateTmr = New System.Timers.Timer
UpdateTmr.Interval = 1000
UpdateTmr.Enabled = True
StartTime = DateTime.Now
BlockWindowStart = StartTime.AddSeconds(10)
BlockWindowEnd = BlockWindowStart.AddSeconds(10)

End Sub

Private Sub UpdateTmr_Elapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs) Handles UpdateTmr.Elapsed
'Exception is thrown
here.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Me.Invoke(New delUpdateForm(AddressOf UpdateForm))
End Sub

Public Delegate Sub delUpdateForm()
Public Sub UpdateForm()
Label1.Text = Now
Dim x As DateTime = DateTime.Now
Dim tsw As TimeSpan = BlockWindowEnd - BlockWindowStart
Debug.Print("Block Window Value: " & tsw.Ticks)

Dim ts As TimeSpan = DateTime.Now - BlockWindowStart
Debug.Print(ts.Ticks)
Debug.Print(DateTime.Now >= BlockWindowStart And DateTime.Now
<= BlockWindowEnd)

End Sub
End Class

Brian,
I tried your code and works fine if you remove the unused class called
"Chronology" at the top of your codepage, because i get "Chronology
not defined" error which you might referenced to an exernal library.

So, i noticed that your code presents the current date and time in the
progress of being updated.

Would you mind using this instead of the code you have if you're still
having difficulty?

Place a timer control named timer1 then paste the following code:

' -------------- Begin ------------

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick

Label1.Text = DateString + " " + TimeString

End Sub

End Class

' ------------- End ----------

As i noticed that does pretty same job with your code.

Hope this helps,

Onur Güzel
 
K

kimiraikkonen

Brian,
I tried your code and works fine if you remove the unused class called
"Chronology" at the top of your codepage, because i get "Chronology
not defined" error which you might referenced to an exernal library.

So, i noticed that your code presents the current date and time in the
progress of being updated.

Would you mind using this instead of the code you have if you're still
having difficulty?

Place a timer control named timer1 then paste the following code:

' -------------- Begin ------------

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick

Label1.Text = DateString + " " + TimeString

End Sub

End Class

' ------------- End ----------

As i noticed that does pretty same job with your code.

Hope this helps,

Onur Güzel

Note, don't forget to set timer's interval to 1000 miliseconds.
 
B

Brian

Note, don't forget to set timer's interval to 1000 miliseconds.- Hide quoted text -

- Show quoted text -

Sorry, the Chronology class is empty at the moment, I intended to put
all of the code dealing with dates or times in this class. Just didn't
get that far before the exception happened.

Thanks for the suggestions though. I would prefer to stay away from
the Windows Forms Timer because eventually I want this to be a class.
But just to clarify, the exception is not thrown each time I close the
app, just occasionaly. I believe that because the Timer is running in
it's own thread, the call back can occur as the form is closing, after
the form has been disposed, so I get the error.

Thanks
 
S

Stephany Young

Two ways to deal with it immediately to mind:

1.
Private Sub UpdateTmr_Elapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs) Handles UpdateTmr.Elapsed

Try
Me.Invoke(New delUpdateForm(AddressOf UpdateForm))
Catch _ex As ObjectDisposedException
' Take no action
Catch _ex As Exception
' Deal with this situation
End Try
End Sub

2.
Handle the FormClosing event for the form and, in it:

UpdateTmr.Enabled = False

Using the first example means that you are dealing with the exception.

Using the second example means that you are stopping the exception from
occuring.
 
C

Cor Ligthert[MVP]

Brian-,

Why not simple ?

\\\
Private WithEvents UpdateTmr As New System.Timers.Timer
///

-Cor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top