在我的 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/