Чтение в файле, вызывающее StackOverflowException в C # - PullRequest
1 голос
/ 01 сентября 2011

Я сейчас работаю над C # wpf проектом.Файлы экспортируются из базы данных в форме оператора SQL.Для каждой строки, которую файл читает в нем, выполняется инструкция для выполнения действия с базой данных на сервере MySQL.

Задача запускается внутри фонового рабочего, который сообщает о прогрессе, поэтому каждый раз, когда строка выполняется на MySQL Server, она вызывает событие изменения прогресса, чтобы обновить индикатор выполнения, чтобы пользователь знал, сколько программавосстановлен на сервере.

Однако, когда он достигает определенной точки, событие с измененным прогрессом завершается с исключением переполнения стека.Ниже приведен код, который обновляет индикатор выполнения, в котором происходит исключение stackoverflow.

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    window.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new System.Windows.Threading.DispatcherOperationCallback(delegate
    {
        progressRestore.IsIndeterminate = false;
        progressRestore.Value = e.ProgressPercentage;
        lblRestProgress.Content = e.ProgressPercentage + "%";
        //lblRestProgressDesc.Content = "Row " + lineCount + " of " + totalRows;
        return null;
    }), null);
}

Как мне разрешить это исключение?Я пытался запустить сборщик мусора, но я не думаю, что это влияет на стек, поэтому он не работал, и я также попытался добавить небольшую задержку для каждого чтения строки, но, похоже, это тоже не помогло.

1 Ответ

2 голосов
/ 01 сентября 2011

Вам не нужно window.Dispatcher.Invoke, так как BackgroundWorker уже отправляет вызовы ProgressChanged обратно в исходное SynchronizationContext. (Предполагается, что вы запускаете BW из потока пользовательского интерфейса ...)

Попробуйте удалить это и просто установить свои значения напрямую:

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     progressRestore.IsIndeterminate = false;
     progressRestore.Value = e.ProgressPercentage;
     lblRestProgress.Content = e.ProgressPercentage + "%";
     //lblRestProgressDesc.Content = "Row " + lineCount + " of " + totalRows;
}
...