Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免在不同类中使用类似后台工作程序的代码重复_C#_.net_Backgroundworker_Code Duplication - Fatal编程技术网

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

C# 避免在不同类中使用类似后台工作程序的代码重复,c#,.net,backgroundworker,code-duplication,C#,.net,Backgroundworker,Code Duplication,我有几个类都在使用backgroundWorker线程来运行逻辑,同时更新主窗体上的状态栏 我发现在多个类别中,backgroundWorkers的许多设置和报告代码都是相同的,例如: BackgroundWorker wkrBackground = new BackgroundWorker(); wkrBackground.WorkerReportsProgress = true; wkrBackground.WorkerSupportsCancellation = true; wkrBack

我有几个类都在使用
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\u RunWorkerCompleted
    wkrBackground\u ProgressChanged
  • 扩展
    backgroundWorker
    以给它一个新的构造函数,该构造函数设置
    WorkerReportsProgress
    WorkerSupportsScanCellation
    ,并改用该类
  • 使用createBackgroundWorker方法创建worker实用程序类(尽管最后两个选项无法避免最后两行的重复,因为这些方法的细节仍将包含在原始类中)

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

我会创建一个控制器类来保存逻辑

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

然后,您将编写一个控制器类,该类具有一个构造函数,您向该构造函数传递了一个
BackgroundWorker
和一个
ICommonUiMethods

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


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

最终选项对我来说似乎是合理的-您可以避免重复最后两行,甚至避免遗漏的一行(
DoWork
事件):

然后用(说)来称呼它:


或者,根据Matthew的建议,为每个
DoWork
ProgressChanged
RunWorkerCompleted
事件提供一个带有方法的接口也会非常好。。。虽然它使这三种方法有效地公开,但它们可以是私有的。请注意,这可能有助于测试…

您的第一个选择取决于类的职责。虽然我怀疑他们代表的是一种关系。一个很常见的指导原则是,一般来说,你应该

我也反对第二种选择——理由同上


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

使用TPL组合异步任务要简单得多。考虑把一切都关掉。对不起,我应该说,我困在2。
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);