Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止System.Timers.Timer停止后引发已用事件?_C#_Timer_Thread Safety_Objectdisposedexception - Fatal编程技术网

C# 如何防止System.Timers.Timer停止后引发已用事件?

C# 如何防止System.Timers.Timer停止后引发已用事件?,c#,timer,thread-safety,objectdisposedexception,C#,Timer,Thread Safety,Objectdisposedexception,我有以下代码: using (FileStream sourceStream = sourceFile.Open()) { using (FileStream targetStream = File.Create(targetFilePath)) { using (Timer timer = new Timer(250)) { timer.Elapsed += (sender, e) => {

我有以下代码:

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

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

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