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

本文关键字:Elapsed 事件 我的 何防止 System Timers Timer | 更新日期: 2023-09-27 17:49:41

我有以下代码:

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,因为流不再打开。

我怎么能防止我的计时器引发经过的事件后,我的流被处置?

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

为什么不这样做呢,不需要计时器:

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