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