2013-04-26 50 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