c# - 为 BackgroundWorker 设计接口(interface)

标签 c# .net backgroundworker

在我的 Windows 窗体应用程序中,我有一个扩展背景 worker 的类,让我们在我的窗体类中将其称为 ExtendedBGW1.cs 我将其声明为成员变量,因此我具有整个类的作用域,如下所示:

public partial class Main : Form
{
    ExtendedBGW1 ebgw1;
}

稍后在表单构造函数中我这样做

public Main()
{
    InitializeComponent();

    ebgw1 = new ExtendedBGW1();

    InitializeBackgoundWorker();
}

我的 InitializeBackgroundWoker() 方法如下所示

private void InitializeBackgoundWorker()
{
    ebgw1.DoWork += new DoWorkEventHandler(ebgw1.worker_DoWork);
    ebgw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted);
    ebgw1.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged);
    ebgw1.WorkerReportsProgress = true;
    ebgw1.WorkerSupportsCancellation = true;
}

现在我的设计问题来了。我现在知道我将拥有更多不同的类,例如我的 exteneddBGW1.cs,它们将扩展 BackGroundWorker,所以我想如果我创建一个 IExtenedBackGroundWorker,我可以做这样的事情。

public partial class Main : Form
{
    IExtenedBackGroundWorker ebgw1;
}

并且仍然有 Main 类的适当范围。然后我可以创建稍后需要的 IExtendedBackGroundWorker 的任何实现。

我可以毫无问题地为方法和属性创建接口(interface),但是当我尝试在接口(interface)、基类和主类之间正确连接事件时,我确实遇到了问题。

有人有什么想法吗?

这是我在 Main 中遇到的错误

Error   1   Cannot assign to 'DoWork' because it is a 'method group'

这是我在实现接口(interface)时遇到的错误

Error   5   The event 'System.ComponentModel.BackgroundWorker.DoWork' can only appear on the left hand side of += or -= 

这是我的界面现在的样子:

interface IExtendedBackGroundWorker 
{
    bool IsBusy { get; }

    bool WorkerReportsProgress { get; set; }

    bool WorkerSupportsCancellation { get; set; }

    List<CompareObject> ObjList { get; set; }

    string FilePath { get; set; }

    void RunWorkerAsync();

    void CancelAsync();

    void DoWork();

    void worker_DoWork(object sender, DoWorkEventArgs e);

    void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e);

    void ProgressChanged(object sender, ProgressChangedEventArgs e);
}

最佳答案

简单,只需 1 - 2 - 3 - 完成

public interface IMyWorker
{
    bool WorkerReportsProgress { get; set; }
    bool WorkerSupportsCancellation { get; set; }
    event DoWorkEventHandler DoWork;
    event ProgressChangedEventHandler ProgressChanged;
    event RunWorkerCompletedEventHandler RunWorkerCompleted;
}

public class MyWorker : BackgroundWorker, IMyWorker
{

}

用法:

namespace stackOverflow
{
class Program
{
    static void Main(string[] args)
    {
        IMyWorker worker = new MyWorker();
        worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
    }

    static void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        throw new NotImplementedException();
    }
  }
}

玩得开心:)

关于c# - 为 BackgroundWorker 设计接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/848179/

相关文章:

c# - 当参数计数小于 List.Count 时出现 FindLastIndex ArgumentOutOfRangeException

c# - 如何在调用 Task.WaitAll 之前了解异常?

c# - NHibernate 关系存在双向获取数据的问题

c# - 用于更新 WinForms UI 的 BackgroundWorker 线程

vb.net - BackgroundWorker 事件处理程序

c# - 在调用 RunWorkerAsync 之后但在函数退出之前取消订阅 DoWork 是否安全?

c# - 如何将 lambda 表达式传递给 WCF 服务?

c# - Serilog 没有写入 MsSql 服务器数据库,也没有显示任何错误

c# - 如何用NHibernate保存由其他复杂类型组成的实体,但我只有其他复杂类型的ID

c# - 结合 ORM、工作单元和存储库模式的主从 View