首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该把一个BackgroundWorker放在一个单点内吗?

我应该把一个BackgroundWorker放在一个单点内吗?
EN

Stack Overflow用户
提问于 2014-03-05 13:02:27
回答 1查看 813关注 0票数 1

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

目前,我的应用程序是一个巨大的混乱-无数的全局变量&在一个独立的BackgroundWorker实例中打开的每个任务等等。

为了澄清-在这里使用BackgroundWorker(更具体地说是DoWorkRunWorkerCompleted事件和WorkerReportsProgress属性)的目的是防止数据包输入操作冻结我的UI。要停止操作,我需要访问这些工作--就目前而言,使用全局变量来实现这一点。

所以问题是-我是否应该将我的BackgroundWorker对象放在一个Singleton-type类中,然后在必要时调用这个对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 13:19:38

从技术角度看是可能的,毕竟单例模式是一种将类的实例化限制为一个对象的设计模式,您可以尝试这样的方法

代码语言:javascript
复制
  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;  }
}

在这里,报告取得了进展

代码语言:javascript
复制
 private void Form1_Load(object sender, EventArgs e)
        {
            BackWorkerSingleton.Worker.ReportProgress += new BackWorkerSingleton.ReportProgressEventHandler(Worker_ReportProgress);
        }

        void Worker_ReportProgress(object sender, MyEventsArgs e)
        {

        }

像这样叫它

代码语言:javascript
复制
BackWorkerSingleton.Worker.StartJob() 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22198564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档