有幾個方法:
不允許申購和抑制發射
子類可以寫入(一)拋出一個異常,如果調用者試圖直接訂閱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
}
}
重燒事件是使用客戶端
而不是抑制使用事件,該子類可以將其與其他事件一起使用(而不是替代)以向訂戶提供相關信息(例如,總操作的進展)。
來源
2013-04-26 09:52:15
drf
C#使用* private *關鍵字。將BGW封裝在你的類中,並使實例變量保密。 – 2013-04-26 11:46:39