我应该将BackgroundWorker放在Singleton中吗?

时间:2014-03-05 13:02:27

标签: c# multithreading singleton backgroundworker

我有一个应用程序,它接受Wireshark捕获文件并将其(包含所有包含的数据包)提供给网络适配器。

目前我的应用程序非常混乱 - 无数的全局变量&在单独的BackgroundWorker实例等中打开的每个任务......

澄清一下 - 在这里使用BackgroundWorker(更具体地说是DoWorkRunWorkerCompleted事件和WorkerReportsProgress属性)的目的是防止数据包馈送操作冻结我的UI。要停止操作,我需要访问这些工作 - 现在,全局变量用于实现此目的。

所以问题是 - 我应该将BackgroundWorker对象放在Singleton类型的类中,然后在必要时调用此对象吗?

1 个答案:

答案 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()