gpt4 book ai didi

c# - 避免不同类中使用的相似背景 worker 的代码重复

转载 作者:行者123 更新时间:2023-12-03 19:49:24 26 4
gpt4 key购买 nike

我有几个类都使用 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,因此希望避免重复。

我考虑了以下选项:

  • 让所有使用后台 worker 的类都继承自同一个抽象类,这样我就可以将 worker 创建方法以及 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);

或者,为每个 DoWorkProgressChangedRunWorkerCompleted 事件提供一个方法接口(interface)也很不错,根据马修的建议......尽管这三种方法在它们本来可以是私有(private)的时候有效地公开了。请注意,它可能有助于测试......

关于c# - 避免不同类中使用的相似背景 worker 的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22322662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com