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

本文关键字:后台 代码 工作程序 同类 | 更新日期: 2023-09-27 17:49:24

我有几个类都使用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实用程序类(尽管最后两个选项不能避免最后两行的重复,因为这些方法的细节仍然包含在原始类中)。

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

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

最后一个选项对我来说似乎是合理的-您可以避免最后两行的重复,甚至是您错过的那一行(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, ProgressChangedRunWorkerCompleted事件提供一个方法的接口也会非常甜蜜,正如马修的建议…虽然它使这三个方法有效地公开,否则它们可以是私有的。

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

首先,您必须识别显示类之间的公共逻辑,并将其封装为接口中指定的一组方法。为了便于讨论,我们称该接口为ICommonUiMethods

然后,你要写一个控制器类,它有一个构造函数,你向它传递一个BackgroundWorker和一个ICommonUiMethods

在控制器的构造函数中,订阅相应的后台worker事件。

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

你的第一个选择取决于你的类的职责。虽然我怀疑它们是否代表关系。一个很常见的指导原则是,一般情况下,如果可以的话,应该避免继承。

我也不建议第二种选择——原因和上面一样。

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