我有一个应用程序,它接受Wireshark
捕获文件并将其(包含所有包含的数据包)提供给网络适配器。
目前我的应用程序非常混乱 - 无数的全局变量&在单独的BackgroundWorker
实例等中打开的每个任务......
澄清一下 - 在这里使用BackgroundWorker
(更具体地说是DoWork
,RunWorkerCompleted
事件和WorkerReportsProgress
属性)的目的是防止数据包馈送操作冻结我的UI。要停止操作,我需要访问这些工作 - 现在,全局变量用于实现此目的。
所以问题是 - 我应该将BackgroundWorker
对象放在Singleton
类型的类中,然后在必要时调用此对象吗?
答案 0 :(得分:2)
从技术角度来看,可能的是,所有单例模式都是一种设计模式,它将类的实例化限制为一个对象 你可以试试这样的东西
public class BackWorkerSingleton
{
private BackgroundWorker _backgroundWorker;
private static readonly object myLock = new object();
private static BackWorkerSingleton _backWorkerSingleton = new BackWorkerSingleton();
public delegate void ReportProgressEventHandler(object sender,MyEventsArgs e);
public event ReportProgressEventHandler ReportProgress = delegate{ };
private BackWorkerSingleton()
{
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += new DoWorkEventHandler(_backgroundWorker_DoWork);
_backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(_backgroundWorker_ProgressChanged);
}
void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.ReportProgress( this, new MyEventsArgs(){Progress = e.ProgressPercentage});
}
void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// do your work here
}
public void StartTheJob()
{
_backgroundWorker.RunWorkerAsync();
}
public static BackWorkerSingleton Worker
{
get
{
lock (myLock)
{
if (_backWorkerSingleton == null)
{
_backWorkerSingleton = new BackWorkerSingleton();
}
}
return _backWorkerSingleton;
}
}
}
class MyEventsArgs:EventArgs
{
public int Progress { get; set; }
}
此处报告进度
private void Form1_Load(object sender, EventArgs e)
{
BackWorkerSingleton.Worker.ReportProgress += new BackWorkerSingleton.ReportProgressEventHandler(Worker_ReportProgress);
}
void Worker_ReportProgress(object sender, MyEventsArgs e)
{
}
并像这样称呼它
BackWorkerSingleton.Worker.StartJob()