Надлежащий способ Избавиться от BackGroundWorker

Это было бы надлежащим способом избавиться от BackGroundWorker? Я не уверен, необходимо ли удалить события прежде, чем назвать.Dispose (). Также называет.Dispose () в делегате RunWorkerCompleted хорошо, чтобы сделать?

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();
}
49
задан galford13x 29 March 2010 в 14:36
поделиться

3 ответа

BackgroundWorker происходит от Component. Component реализует интерфейс IDisposable. Это, в свою очередь, заставляет BackgroundWorker наследовать метод Dispose().

Производные от Component - это удобство для программистов Windows Forms, они могут бросить BGW из панели инструментов на форму. Компоненты в целом с некоторой вероятностью будут иметь что-то для утилизации. Дизайнер Windows Forms заботится об этом автоматически, посмотрите в файле Designer.cs для формы поле "components". Его автоматически созданный метод Dispose() вызывает метод Dispose() для всех компонентов.

Однако BackgroundWorker на самом деле не имеет ни одного члена, требующего утилизации. Он не переопределяет Dispose(). Его базовая реализация, Component.Dispose(), только следит за тем, чтобы компонент был удален из коллекции "components". И поднимает событие Disposed. Но никак иначе не утилизирует ничего.

Короче говоря: если вы бросили BGW на форму, то все будет сделано автоматически, вам не нужно помогать. Если вы не бросали его на форму, то это не элемент в коллекции компонентов и ничего не нужно делать.

Вам не нужно вызывать Dispose()

70
ответ дан 7 November 2019 в 11:45
поделиться

Да, кажется, это правильно. Конечно, с одноразовыми объектами лучше работать с с использованием блоков , но у вас нет такой возможности.

Я обычно создаю свои фоновые обработчики со временем жизни формы, повторно использую их и позволяю коду дизайнера обрабатывать удаление при закрытии формы. Меньше думать.

0
ответ дан 7 November 2019 в 11:45
поделиться

Если это на "WinForms" форме, пусть контейнер позаботится об этом (см. сгенерированный код Dispose в файле Form.Designer.xyz)

На практике я обнаружил, что вам может понадобиться создать экземпляр контейнера и добавить в него worker (или другой компонент), если кто-то знает более официальный способ сделать это, кричите!!!

PK :-)

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);
    }

}
0
ответ дан 7 November 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: