2011-04-12 124 views
0

我有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被拋出,因爲流不再被打開。

如何防止在我的流被丟棄後,我的計時器會提高流逝的事件?

回答

3

爲什麼不只是這樣做,不需要定時器:

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)); 
     } 
    } 
}