隐藏ProgressChanged事件
本文关键字:事件 ProgressChanged 隐藏 | 更新日期: 2023-09-27 18:10:55
是否可以在后台工人类中隐藏ProgressChanged事件?
我创建了一个继承System.ComponentModel.BackgroundWorker
的类,我需要有多个事件:我的类处理一个对象列表,我需要(例如)在对象被处理之前和之后都有事件。我从Backgroundworker的ProgressChanged事件中触发这些事件,因为它是线程安全的。在我调用ReportProgress
时调用的类中的方法然后使用该参数确定要触发哪个事件。作品。
现在我想确保,类调用我的后台工作者是不允许直接订阅ProgressChanged
事件。相反,它应该只能订阅我提供的其他事件。
有几种方法:
禁止订阅和抑制触发
子类可以写为(a)抛出一个异常,如果调用者试图直接订阅ProcessChange
事件,(b)根本不引发事件。注意(a)单独不能阻止事件被订阅,因为调用者可以将子类转换为BackgroundWorker
并直接订阅事件:
class ExtendedBackgroundWorker : BackgroundWorker
{
public new event ProgressChangedEventHandler ProgressChanges
{
add { throw new InvalidOperationException("This event cannot be added directly"); }
remove {}
}
protected override void OnProgressChanged(ProgressChangedEventArgs e)
{
// do not call base.OnProgressChanged
}
}
用复合代替继承
但是,如果可能的话,更好的方法可能是根本不继承BackgroundWorker
。BackgroundWorker
使用ProgressChanged
事件报告进度变化;如果它不这样做,它就不是BackgroundWorker
。相反,可以考虑将BackgroundWorker实现为私有类成员,并根据需要公开成员中的成员,例如:
class CustomBackgroundWorker : Component
{
private BackgroundWorker worker;
public event ProgressChangedEventHandler FirstEvent;
public event ProgressChangedEventHandler SecondEvent;
public event DoWorkEventHandler DoWork
{
add { worker.DoWork += value; }
remove { worker.DoWork -= value; }
}
public event RunWorkerCompletedEventHandler RunWorkerCompleted
{
add { worker.RunWorkerCompleted += value; }
remove { worker.RunWorkerCompleted -= value; }
}
public CustomBackgroundWorker()
{
worker = new BackgroundWorker();
worker.ProgressChanged += OnProgressChanged;
worker.WorkerReportsProgress = true;
}
public void RunWorkerAsync()
{
worker.RunWorkerAsync();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
worker.Dispose();
}
private void OnProgressChanged(object o, ProgressChangedEventArgs e)
{
// code to handle progress change reports from the worker
}
}
客户端使用Refire事件
与其抑制事件的使用,子类可以将其与其他事件一起使用(而不是替代),以向订阅者提供相关信息(例如,整个操作的进度)。