如何防止我的System.Timers.Timer在停止后引发Elapsed事件?

问题描述:

我有followig代码:如何防止我的System.Timers.Timer在停止后引发Elapsed事件?

using (FileStream sourceStream = sourceFile.Open()) 
{ 
    using (FileStream targetStream = File.Create(targetFilePath)) 
    { 
     using (Timer timer = new Timer(250)) 
     { 
      timer.Elapsed += (sender, e) => 
      { 
       if (this.FileCopyProgressChanged != null) 
       { 
        //Here the ObjectDisposedException appears 
        this.FileCopyProgressChanged(this, 
         new CopyProgressEventArgs(
          sourceStream.Length, 
          targetStream.Length)); 
       } 
      }; 

      timer.Start(); 

      sourceStream.CopyTo(targetStream); 

      timer.Stop(); 
     } 
    } 
} 

我定时器每250毫秒经过,并提出有关流复制进度信息的事件。 问题是,有时在计时器事件中,ObjectDisposedException被抛出,因为流不再被打开。

如何防止在我的流被丢弃后,我的计时器会提高流逝的事件?

为什么不只是这样做,不需要定时器:

using (FileStream sourceStream = sourceFile.Open()) 
{ 
    using (FileStream targetStream = File.Create(targetFilePath)) 
    { 
     int bytesTotal = sourceStream.Length; 
     int bytesCurrent = 0; 
     var buffer = new byte[32*1024]; 
     int bytes; 
     while ((bytes = sourceStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      targetStream.Write(buffer, 0, bytes); 
      bytesCurrent += bytes; 
      FileCopyProgressChanged(this, 
       new CopyProgressEventArgs(bytesTotal, bytesCurrent)); 
     } 
    } 
}