2011-04-12 6 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)); 
     } 
    } 
} 
関連する問題