我有几个类都使用backgroundWorker
个线程在更新主窗体上的状态栏时运行逻辑。
我发现backgroundWorkers
的很多设置和报告代码在多个类中是相同的,例如:
BackgroundWorker wkrBackground = new BackgroundWorker();
wkrBackground.WorkerReportsProgress = true;
wkrBackground.WorkerSupportsCancellation = true;
wkrBackground.RunWorkerCompleted += new RunWorkerCompletedEventHandler(wkrBackground_RunWorkerCompleted);
wkrBackground.ProgressChanged += new ProgressChangedEventHandler(wkrBackground_ProgressChanged);
我确信我不需要以任何其他方式使用backgroundWorkers
,所以我希望避免重复。
我考虑过以下几种选择:
wkrBackground_RunWorkerCompleted
和wkrBackground_ProgressChanged
backgroundWorker
,为其提供一个新的构造函数,用于设置WorkerReportsProgress
和WorkerSupportsCancellation
并使用该类代替我想知道是否有一种标准方法来处理这种重复?
答案 0 :(得分:4)
最终选项对我来说似乎是合理的 - 你可以避免重复最后两行,甚至是你错过的那一行(DoWork
事件):
public static BackgroundWorker CreateBackgroundWorker
(DoWorkEventHandler workHandler,
ProgressChangedEventHandler progressHandler,
RunWorkerCompletedEventHandler completedHandler)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += workHandler;
worker.ProgressChanged += progressHandler;
worker.RunWorkerCompleted += completedHandler;
}
然后用(说):
打电话BackgroundWorker = BackgroundWorkerHelper.CreateBackgroundWorker(
wkrBackground_DoWork, wkrBackground_ProgressChanged,
wkrBackground_RunWorkerCompleted);
或者,根据马修的建议,为每个DoWork
,ProgressChanged
和RunWorkerCompleted
事件设置一个方法的接口也会非常甜蜜......尽管它会使那些三种方法可以有效地公开,否则它们可以是私人的它可能有助于测试,请注意......
答案 1 :(得分:1)
我创建一个Controller类来保存逻辑。
首先,您必须确定显示类之间的通用逻辑,并将其封装为接口中指定的一组方法。为了论证,让我们称之为接口ICommonUiMethods
。
然后,您将编写一个控制器类,该类具有您传递BackgroundWorker
和ICommonUiMethods
的构造函数。
在控制器的构造函数中,订阅适当的后台工作程序事件。
在控制器对这些事件的处理程序的实现中,调用传递给构造函数的ICommonUiMethods
的相应方法。
答案 2 :(得分:1)
您的第一个选择取决于您的课程的职责。虽然我怀疑它们代表是的关系。一个非常常见的指导原则是,您应该avoid inheritance if you can。
我也建议反对第二种选择 - 原因与上述相同。
你的第三个选择似乎是最好的选择 - 毕竟,它正是你想要的:创建背景工作者的标准位置。因此, factory 的概念正是您所需要的。您也可以通过这种方式提供或配置委托回调,因此重复次数会更少(甚至是您提到的最后两行)。