Показать прогресс в диалоге - PullRequest
2 голосов
/ 04 декабря 2009

У меня есть процесс, который занимает много времени, и я хочу окно, чтобы показать прогресс. Но я не могу понять, как отобразить прогресс.

Вот код:

if (procced)
{
    // the wpf windows :
    myLectureFichierEnCour = new LectureFichierEnCour(_myTandemLTEclass);
    myLectureFichierEnCour.Show();

    bgw = new BackgroundWorker();
    bgw.DoWork += startThreadProcessDataFromFileAndPutInDataSet;
    bgw.RunWorkerCompleted += threadProcessDataFromFileAndPutInDataSetCompleted;

    bgw.RunWorkerAsync();
}

И

private void startThreadProcessDataFromFileAndPutInDataSet(object sender, DoWorkEventArgs e)
{
    _myTandemLTEclass.processDataFromFileAndPutInDataSet(
        _strCompositeKey,_strHourToSecondConversion,_strDateField);
}

Я могу позвонить _myTandemLTEclass.processProgress, чтобы получить подсказку о прогрессе.

Ответы [ 2 ]

6 голосов
/ 04 декабря 2009

Вы должны обработать событие ProgressChanged и обновить индикатор выполнения в вашем пользовательском интерфейсе.

В фактической функции, которая выполняет работу (DoWork обработчик событий), вы вызовете метод ReportProgress экземпляра BackgroundWorker с аргументом, определяющим объем выполненной задачи.

Пример BackgroundWorker в библиотеке MSDN - это простой фрагмент кода, который выполняет эту работу.

1 голос
/ 04 декабря 2009

Ваш поток backgroundWorker должен обрабатывать метод DoWork и ProgressChanged.

Также необходимо убедиться, что флаг WorkerReportsProgress установлен в значение true (по умолчанию отключено).

См. Пример кода:

private void downloadButton_Click(object sender, EventArgs e)
{
    // Start the download operation in the background.
    this.backgroundWorker1.RunWorkerAsync();

    // Disable the button for the duration of the download.
    this.downloadButton.Enabled = false;

    // Once you have started the background thread you 
    // can exit the handler and the application will 
    // wait until the RunWorkerCompleted event is raised.

    // Or if you want to do something else in the main thread,
    // such as update a progress bar, you can do so in a loop 
    // while checking IsBusy to see if the background task is
    // still running.

    while (this.backgroundWorker1.IsBusy)
    {
        progressBar1.Increment(1);
        // Keep UI messages moving, so the form remains 
        // responsive during the asynchronous operation.
        Application.DoEvents();
    }
}
...