我有一个简单的用户控件用于数据库分页,它使用控制器执行实际的DAL调用。我使用
表格A持有我的用户控件。当我点击打开表格B的某个按钮时,即使我什么也不做,只是关闭它,并尝试从我的数据库中带入下一页,
目前,我在那里的处理程序中添加了
编辑:
我已经成功将问题缩小到arcgis和
第一个按钮运行一个
起初,所有对
打开并关闭 Form2 后,RunWorkerCompleted 始终在工作线程上调用。我想补充说明的是,我可以只按原样解决此问题(在 RunWorkerCompleted 方法中检查 InvokeRequired),但我想知道为什么会违背我的预期发生这种情况。在我的“真实”代码中,我希望始终知道 RunWorkerCompleted 方法在主线程上被调用。
我成功地将问题定位到 BackgroundTesterBtn 中的 form.Show(); 命令 - 如果我使用 ShowDialog(),则不会出现问题(RunWorkerCompleted 总是在主线程上运行)。但是我需要在 ArcMap 项目中使用 Show(),以便用户不受限于该表单。
我还尝试在普通的WinForms项目中重现了这个bug。我添加了一个简单的项目,只是打开第一个没有ArcMap的窗体,但在那种情况下,无论我使用
这是我的简单sln (VS2005sp1) Here - 它需要...
BackgroundWorker
来执行繁重的工作,在OnWorkCompleted
事件上重新启用一些按钮,更改TextBox.Text
属性并为父窗体引发事件。表格A持有我的用户控件。当我点击打开表格B的某个按钮时,即使我什么也不做,只是关闭它,并尝试从我的数据库中带入下一页,
OnWorkCompleted
会在工作线程上被调用(而不是我的主线程),并抛出跨线程异常。目前,我在那里的处理程序中添加了
InvokeRequired
的检查,但是OnWorkCompleted
的整个目的不是应该在主线程上被调用吗?为什么不能按预期工作?编辑:
我已经成功将问题缩小到arcgis和
BackgroundWorker
。我有以下解决方案,其中添加了一个命令到arcmap,该命令打开一个简单的Form1
,其中包含两个按钮。第一个按钮运行一个
BackgroundWorker
,它会休眠500毫秒并更新计数器。在RunWorkerCompleted
方法中,它检查InvokeRequired
,并更新标题以显示该方法最初是在主线程还是工作线程内运行。第二个按钮只是打开Form2
,其中什么也没有。起初,所有对
RunWorkerCompleted
的调用都在主线程中进行(正如预期的那样 - 这是BackgroundWorker
上MSDN所解释的)。打开并关闭 Form2 后,RunWorkerCompleted 始终在工作线程上调用。我想补充说明的是,我可以只按原样解决此问题(在 RunWorkerCompleted 方法中检查 InvokeRequired),但我想知道为什么会违背我的预期发生这种情况。在我的“真实”代码中,我希望始终知道 RunWorkerCompleted 方法在主线程上被调用。
我成功地将问题定位到 BackgroundTesterBtn 中的 form.Show(); 命令 - 如果我使用 ShowDialog(),则不会出现问题(RunWorkerCompleted 总是在主线程上运行)。但是我需要在 ArcMap 项目中使用 Show(),以便用户不受限于该表单。
我还尝试在普通的WinForms项目中重现了这个bug。我添加了一个简单的项目,只是打开第一个没有ArcMap的窗体,但在那种情况下,无论我使用
Show()
还是ShowDialog()
,在打开Form2
之前和之后,RunWorkerCompleted
都在主线程上运行。我尝试添加第三个窗体作为Form1
之前的主窗体,但结果没有改变。这是我的简单sln (VS2005sp1) Here - 它需要...
ESRI.ArcGIS.ADF(9.2.4.1420)
ESRI.ArcGIS.ArcMapUI(9.2.3.1380)
ESRI.ArcGIS.SystemUI(9.2.3.1380)