我有一个应用程序,它接受Wireshark捕获文件并将它(所有包含的数据包)输入到网络适配器中。
目前,我的应用程序是一个巨大的混乱-无数的全局变量&在一个独立的BackgroundWorker实例中打开的每个任务等等。
为了澄清-在这里使用BackgroundWorker(更具体地说是DoWork、RunWorkerCompleted事件和WorkerReportsProgress属性)的目的是防止数据包输入操作冻结我的UI。要停止操作,我需要访问这些工作--就目前而言,使用全局变量来实现这一点。
所以问题是-我是否应该将我的BackgroundWorker对象放在一个Singleton-type类中,然后在必要时调用这个对象?
发布于 2014-03-05 13:19:38
从技术角度看是可能的,毕竟单例模式是一种将类的实例化限制为一个对象的设计模式,您可以尝试这样的方法
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() https://stackoverflow.com/questions/22198564
复制相似问题