正确的方式来处置一个BackgroundWorker的正确、方式、BackgroundWorker

2023-09-02 01:30:56 作者:情在⒈夜之间﹏

这将是一个适当的方式处理一个BackgroundWorker的?我不知道这是否是necesary调用.Dispose之前删除的事件()。同时呼吁.Dispose()的RunWorkerCompleted代表内确定这样做?

 公共无效RunProcessAsync(日期时间dumpDate)
{
    BackgroundWorker的工作人员=新的BackgroundWorker();
    worker.RunWorkerCompleted + =新RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.DoWork + =新DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync(dumpDate);
}

无效worker_DoWork(对象发件人,DoWorkEventArgs E)
{
    //做的工作在这里
}

无效worker_RunWorkerCompleted(对象发件人,RunWorkerCompletedEventArgs E)
{
    BackgroundWorker的工人=发件人为BackgroundWorker的;
    worker.RunWorkerCompleted  -  =新RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.DoWork  -  =新DoWorkEventHandler(worker_DoWork);
    worker.Dispose();
}
 

解决方案

BackgroundWorker的源于组件。组件实现了IDisposable接口。这反过来又使得BackgroundWorker的继承Dispose()方法。

从Component派生是一个方便的Windows Forms程序员来说,他们可以从工具箱中拖放BGW到窗体。一般组件有些可能有事要处理。 Windows窗体设计器会自动处理这个,看在Designer.cs文件的形式对部件领域。它的自动生成的Dispose()方法调用Dispose()方法的所有组件。

不过,BackgroundWorker的实际上没有需要处理的任何成员。它不会覆盖Dispose()方法。它的基本实现,Component.Dispose(),只可以确保部件从部件集合中删除。并提高了处置事件。但不以其他方式处置任何东西。

长话短说:如果你放弃了BGW窗体上,然后一切都采取自动处理,你没有帮助。如果你没有把它在窗体上那么它是不是一个组件集合的元素,并没有什么需要做的事情。

你不必调用Dispose()的。

Would this be a proper way to dispose of a BackGroundWorker? I'm not sure if it is necesary to remove the events before calling .Dispose(). Also is calling .Dispose() inside the RunWorkerCompleted delegate ok to do?

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();
}
看完下图后.你认为丢钱同学的正确处理方法有①用法律知识劝告捡钱的同学.要回丢失的钱 ②找几个朋友强行要回丢失的钱 ③请学校.居委会或派出所帮忙 ④痛打该同学一顿

解决方案

BackgroundWorker derives from Component. Component implements the IDisposable interface. That in turn makes BackgroundWorker inherit the Dispose() method.

Deriving from Component is a convenience for Windows Forms programmers, they can drop a BGW from the toolbox onto a form. Components in general are somewhat likely to have something to dispose. The Windows Forms designer takes care of this automatically, look in the Designer.cs file for a Form for the "components" field. Its auto-generated Dispose() method calls the Dispose() method for all components.

However, BackgroundWorker doesn't actually have any member that requires disposing. It doesn't override Dispose(). Its base implementation, Component.Dispose(), only makes sure that the component is removed from the "components" collection. And raise the Disposed event. But doesn't otherwise dispose anything.

Long story short: if you dropped a BGW on a form then everything is taken care of automatically, you don't have to help. If you didn't drop it on a form then it isn't an element in a components collection and nothing needs to be done.

You don't have to call Dispose().