Проверьте, работает ли еще поток в другой форме - PullRequest
3 голосов
/ 09 августа 2011

У меня есть приложение Windows Form, которое включает две формы.Дочерняя форма используется для экспорта данных в CSV-файлы и использует фоновый рабочий для записи файла.Пока это происходит, у меня есть скрытая форма.Родительская форма все еще активна, пока работает фоновый работник, поэтому пользователь может выйти из приложения, даже когда фоновый работник пишет файлы.В родительской форме я добавил обработчик событий FormClosing, чтобы запросить у пользователя, работает ли фоновый работник.Я сталкиваюсь с проблемой доступа к фоновому рабочему в родительской форме.Вот что я попробовал ...

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        ExportForm eForm = new ExportForm(GridView, TableName, GridProgressBar, ProgressLabel);

        if (eForm.PartWorker.IsBusy == true)
            MessageBox.Show("Busy");
    }

Проблема в том, что он создает новый экземпляр дочерней формы, поэтому фоновый работник никогда не будет иметь значение true для своего атрибута IsBusy.Как я могу получить доступ к этому фоновому работнику в родительской форме, чтобы проверить, выполняется ли это условие.

Вот код для PartWorker BackgroundWorker ...

    #region PartWorker Events

    void PartWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        GetSwitch();
        int batchNum = 0;
        bool done = false;
        ProgressLabel.Visible = true;

        while (!done)
        {
            for (int i = 1; i <= 100; i++)
            {
                Thread.Sleep(100);
                PartWorker.ReportProgress(i);
            }

            done = Export.ExportPartition(SaveFile, DataTable, 50000, batchNum++);
        }
    }

    void PartWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Progress.Style = ProgressBarStyle.Blocks;
        Progress.Value = e.ProgressPercentage;
        //May want to put the file name that is being written here.
        ProgressLabel.Text = "Writing File: " + e.ProgressPercentage.ToString()  +"% Complete";
    }

    void PartWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Progress.Value = 100;
        ProgressLabel.Visible = false;
        Progress.Visible = false;
        MessageBox.Show("Files sucessfully created!", "Files Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
        PartWorker.Dispose();
        this.Close();
    }
    #endregion

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Содержит ссылку на дочернюю форму в основной форме:

class MainForm : Form {
    private ExportForm exportForm;

    // assign exportForm wherever the child form is created
}

Далее, в вашем ExportForm создайте свойство, которое указывает, что форма все еще занята.
Это лучший подход, чем доступ к его BackgroundWorker (читай: инкапсуляция).

class ExportForm : Form {
    public bool IsBusy {
        get { return this.PartWorker.IsBusy; }
    }
}

Затем выполните проверку в основной форме, обратившись к вновь созданному свойству:

void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.exportForm.IsBusy)
        MessageBox.Show("Busy");
}
0 голосов
/ 09 августа 2011

Создайте одноэлементный бизнес-объект, который содержит фонового работника или коллекцию фоновых работников (если их может быть несколько). Создайте свой фоновый рабочий из дочерней формы в этот синглтон, и он будет доступен всем в домене приложения.

...