.NET 3.5 C# Bug with System.Timer System.ObjectDisposedException: Cannot access a disposed object -
in windows service app using timers lot. i'm using system.timers. i've never experienced problem before, got exception:
system.objectdisposedexception: cannot access disposed object. @ system.threading.timerbase.changetimer(uint32 duetime, uint32 period) @ system.threading.timer.change(int32 duetime, int32 period) @ system.timers.timer.updatetimer() @ system.timers.timer.set_interval(double value) @ myapp.myspace.myspace2.myclasswithtimer.methodchangetimerinterval()
in method stopping timer, , changing timer interval. place got exception.
i have read bug still passible have bug in .net 3.5?
how fix it? should renew timer object after stopping , set interval new object? using gc.keepalive(datatimer);
edit: found other questions problem:
*i found link http://www.kbalertz.com/kb_842793.aspx stop timer, internal system.threading.timer becomes available garbage collection, causing elapsed event not occur, or causing disposed reference exception. although not described in article, solution create new timer every time timer stopped , re-add elapsed events. not efficient easy, , not problem processor-wise me. has totally solved problem. cheers responded.*
but confused why bug still there, , need sure re-adding timer idea...
code caused error:
private void startasyncresponsetimer() { switch (_lastrequesttype) { case 1: asyncresponsetimer.interval = 1000; break; case 2: asyncresponsetimer.interval = 2000; break; case 3: asyncresponsetimer.interval = 3000; break; default: asyncresponsetimer.interval = 10000; break; } asyncresponsetimer.start(); }
function called serialportdatareceived event:
private void serialportdatareceived(object sender, eventargs e) { startasyncresponsetimer(); }
timer stopped before calling changing interval.
timer private field of class:
private timer asyncresponsetimer = new timer();
edit: application has been running several months in row , first time got exception!
my dispose pattern:
public class serialportcommunication{ ... private void serialportdatareceived(object sender, eventargs e) { readresponse(); startasyncresponsetimer(); } //used determine if recieving response on private void startasyncresponsetimer() { switch (_lastrequesttype) { case 1: asyncresponsetimer.interval = 1000; break; case 2: asyncresponsetimer.interval = 2000; break; case 3: asyncresponsetimer.interval = 3000; break; default: asyncresponsetimer.interval = 10000; break; } asyncresponsetimer.start(); } public virtual void dispose() { dispose(true); gc.suppressfinalize(this); } private void dispose(bool disposing) { if (!this._disposed) { if (disposing) { // dispose managed resources. } // dispose unmanaged resources. _disposed = true; stop(); } } ~someclass() { dispose(false); } #endregion public void stop() { _asyncresponsetimer.stop(); serialportmanager.closeport(); } }
can getting serial port data after have disposed timer? thing comes mind data have posted!. doing in stop()! method inside dispose()????
Comments
Post a Comment