2013-04-26 53 views
3

是否可以隐藏BackgroundWorker类中的ProgressChanged事件?隐藏ProgressChanged事件

我创建了一个继承System.ComponentModel.BackgroundWorker的类,我需要有多个事件:我的类处理一个对象列表,我需要(例如)在处理对象之前和之后有事件。我从Backgroundworker的ProgressChanged事件中触发这些事件,因为它是线程安全的。我在调用ReportProgress时调用的类中的方法使用参数来确定要触发哪个事件。这样可行。

现在我要确保,在调用我的BackgroundWorker类不允许直接订阅ProgressChanged事件。相反,它应该只能订阅我提供的其他事件。

+0

C#使用* private *关键字。将BGW封装在你的类中,并使实例变量保密。 – 2013-04-26 11:46:39

回答

2

有几个方法:

不允许申购和抑制发射

子类可以写入(一)抛出一个异常,如果调用者试图直接订阅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继承。 A 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 
    } 
} 

重烧事件是使用客户端

而不是抑制使用事件,该子类可以将其与其他事件一起使用(而不是替代)以向订户提供相关信息(例如,总操作的进展)。

+0

“如果不这样做,它不是BackgroundWorker”。好点,我正在寻找一个快速胜利,但有一个干净的结构绝对是最好的。 – Jan 2013-04-26 14:37:06