【发布时间】:2014-07-17 17:32:04
【问题描述】:
我的代码使用 BackgroundWorker 从 Excel 工作表中读取信息并将其上传到数据库,同时还显示一个通知用户进度的表单。这是一个 C# 项目。
但是,在读取 excel 文件并上传它们的 try/catch 语句中,我希望能够关闭进度表单,因为它不再有用了。
当我调用 BackgroundWorker 类的 .Close() 方法时,会触发 InvalidOperationException,我不确定如何处理这种情况。有没有办法处理它?还有其他方法可以关闭窗口吗?
这是我的 catch 块(位于 DoWork 事件中):
catch (Exception ex)
{
MessageBox.Show("Error Uploading Data. See log for details.", "Database Submission Error", MessageBoxButtons.OK);
// Cancel operation
backgroundWorker1.CancelAsync();
// Close form
progress.Close();
}
backgroundWorker1是BackgroundWorker读取/上传数据,progress是显示进度条和计数完成/剩余信息的窗口。
例外:
System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理其他信息:跨线程操作无效:从线程以外的线程访问的控件“ProgressForm”它创建于。
【问题讨论】:
-
是的,格兰特。我不确定为什么我被指责没有阅读异常,或者为什么有人会评论只是告诉我我需要修复错误。显然我知道,但无法弄清楚这就是我在这里的原因。异常内容为“System.Windows.Forms.dll 中发生‘System.InvalidOperationException’类型的异常,但未在用户代码中处理附加信息:跨线程操作无效:控件‘ProgressForm’从除创建它的线程。”所以也许我不能在 backgroundWorker1 方法中调用 .Close() ?应该在哪里?
-
让自己熟悉 UI 线程和后台线程的区别。在进行 GUI 编程时了解这一点至关重要。 google.com/… 这应该让你开始。
-
里面肯定有一些有价值的资源,谢谢。我只用了几个月的 C# 编程,这是我的第一个线程项目。简单的初学者错误,所以我很感激输入。
标签: c# exception asynchronous try-catch backgroundworker