避免在不同类中使用的类似后台工作者的代码重复

时间:2014-03-11 10:16:03

标签: c# .net backgroundworker code-duplication

我有几个类都使用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_RunWorkerCompletedwkrBackground_ProgressChanged
  • 扩展backgroundWorker,为其提供一个新的构造函数,用于设置WorkerReportsProgressWorkerSupportsCancellation并使用该类代替
  • 使用createBackgroundWorker方法创建一个worker实用程序类(尽管最后两个选项不会避免最后两行的重复,因为这些方法的细节仍将包含在原始类中)。

我想知道是否有一种标准方法来处理这种重复?

3 个答案:

答案 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);

或者,根据马修的建议,为每个DoWorkProgressChangedRunWorkerCompleted事件设置一个方法的接口也会非常甜蜜......尽管它会使那些三种方法可以有效地公开,否则它们可以是私人的它可能有助于测试,请注意......

答案 1 :(得分:1)

我创建一个Controller类来保存逻辑。

首先,您必须确定显示类之间的通用逻辑,并将其封装为接口中指定的一组方法。为了论证,让我们称之为接口ICommonUiMethods

然后,您将编写一个控制器类,该类具有您传递BackgroundWorkerICommonUiMethods的构造函数。

在控制器的构造函数中,订阅适当的后台工作程序事件。

在控制器对这些事件的处理程序的实现中,调用传递给构造函数的ICommonUiMethods的相应方法。

答案 2 :(得分:1)

您的第一个选择取决于您的课程的职责。虽然我怀疑它们代表的关系。一个非常常见的指导原则是,您应该avoid inheritance if you can

我也建议反对第二种选择 - 原因与上述相同。

你的第三个选择似乎是最好的选择 - 毕竟,它正是你想要的:创建背景工作者的标准位置。因此, factory 的概念正是您所需要的。您也可以通过这种方式提供或配置委托回调,因此重复次数会更少(甚至是您提到的最后两行)。