代码之家  ›  专栏  ›  技术社区  ›  galford13x

处理地下工作者的正确方法

  •  46
  • galford13x  · 技术社区  · 15 年前

    这是一个适当的方式来处理一个后台工作人员?我不确定是否需要在调用.Dispose()之前删除事件。在RunWorkerCompleted委托中调用.Dispose()是否也可以?

    public void RunProcessAsync(DateTime dumpDate)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerAsync(dumpDate);
    }
    
    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do Work here
    }
    
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
        worker.Dispose();
    }
    
    5 回复  |  直到 15 年前
        1
  •  76
  •   Hans Passant    15 年前

    BackgroundWorker派生自组件。组件实现IDisposable接口。这反过来又使BackgroundWorker继承Dispose()方法。

    从组件派生对于Windows窗体程序员来说是一种方便,他们可以将BGW从工具箱放到窗体上。一般来说,组件可能有一些东西需要处理。Windows窗体设计器会自动处理此问题,请在designer.cs文件中查找“components”字段的窗体。它自动生成的Dispose()方法为所有组件调用Dispose()方法。

    但是,BackgroundWorker实际上没有任何需要处理的成员。它不重写Dispose()。它的基本实现Component.Dispose()只确保该组件从“components”集合中删除。并引发已处置事件。但不会处理任何东西。

    您不必调用Dispose() .

        2
  •  13
  •   Paul    14 年前

    游戏进行得很晚,但我遇到了一个与你的问题相关的场景,我想我会和你分享。如果您在类级别创建worker,并在不关闭应用程序的情况下在后续操作中重用它,如果您在完成后不删除事件,它们将在每次后续执行中递增并运行多次。

    worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
    

    如果没有以上我的嫁妆火一次,两次第二次,等等,这可能是一个没有大脑的大多数人,但它花了我一点来找出它,所以希望这将有助于其他人了。

        3
  •  2
  •   Em1    12 年前

    worker.Dispose() 不需要,因为 Dispose() 自动调用。但在处理对象之前,需要删除所有事件处理程序。

    这个 article

    worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandle(worker_RunWorkerCompleted);
    worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
    
        4
  •  0
  •   Michael Petrotta user3140870    15 年前

    using 街区,但你没有这个选择。

    我通常使用窗体生命周期创建我的后台处理程序,重用它们,并让设计器代码处理窗体上的处理。少去想。

        5
  •  0
  •   Paul Kohler    15 年前

    Dispose Form.Designer.xyz文件中的代码)

    在实践中,我发现您可能需要创建一个容器实例,并将worker(或其他公司)添加到其中,如果有人知道一种更正式的方法来实现这一点,请大声喊叫!!

    主键:-)

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            // watch the disposed event....
            backgroundWorker1.Disposed += new EventHandler(backgroundWorker1_Disposed);
    
            // try with and without the following lines
            components = new Container();
            components.Add(backgroundWorker1);
        }
    
        void backgroundWorker1_Disposed(object sender, EventArgs e)
        {
            Debug.WriteLine("backgroundWorker1_Disposed");
        }
    
    //... from the Designer.xyz file ...
    
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
    }