我目前正在开发一个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);
}
如何解决此异常?我试图运行垃圾收集器,但我不认为这会影响堆栈,所以它不起作用,我也尝试为每行读取添加一个小延迟,但这似乎也没有帮助。
答案 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;
}