读取导致C#中的StackOverflowException的文件

时间:2011-09-01 16:16:02

标签: c# wpf backgroundworker stack-overflow

我目前正在开发一个C#wpf项目。这些文件是从数据库导出的数据,这些数据采用SQL语句的形式。对于文件读入的每一行,它执行语句以对MySQL服务器内的数据库执行操作。

任务在后台工作程序中运行,后者报告进度,因此每次在MySQL服务器上执行一行时,它会调用progress changed事件来更新进度条,以便用户知道程序已恢复到多少服务器。

然而,当它到达某个点时,进度改变事件崩溃并出现堆栈溢出异常。下面是更新进度条的代码,进度条是发生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 个答案:

答案 0 :(得分:2)

您不应该需要window.Dispatcher.Invoke,因为BackgroundWorker已经将对ProgressChanged的来电回复到其原始SynchronizationContext。 (这假设您是从UI线程启动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;
}