469,292 Members | 1,294 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,292 developers. It's quick & easy.

How Do I: 'System.ObjectDisposedException'

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
Jun 27 '08 #1
5 4670
On Apr 14, 8:09 pm, Brian <LineSupp...@gmail.comwrote:
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 Gzel
Jun 27 '08 #2
On Apr 14, 8:25 pm, kimiraikkonen <kimiraikkone...@gmail.comwrote:
On Apr 14, 8:09 pm, Brian <LineSupp...@gmail.comwrote:
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 Gzel
Note, don't forget to set timer's interval to 1000 miliseconds.
Jun 27 '08 #3
On Apr 14, 1:28*pm, kimiraikkonen <kimiraikkone...@gmail.comwrote:
On Apr 14, 8:25 pm, kimiraikkonen <kimiraikkone...@gmail.comwrote:


On Apr 14, 8:09 pm, Brian <LineSupp...@gmail.comwrote:
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, ByVale
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 Gzel

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
Jun 27 '08 #4
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.
"Brian" <Li*********@gmail.comwrote in message
news:81**********************************@m71g2000 hse.googlegroups.com...
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
Jun 27 '08 #5
Brian-,

Why not simple ?

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

-Cor
Jun 27 '08 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by TomPel | last post: by
reply views Thread by Richard Blewett [DevelopMentor] | last post: by
3 posts views Thread by Martin Pöpping | last post: by
2 posts views Thread by Bernard Borsu | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by harlem98 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.