我们在 Windows.Forms 解决方案中创建了几个线程。
我们还有一个 BrowserControl(是的,它是 OAUTH),当然我发现调试问题 -
跨线程操作无效:控件“xxForm”从创建它的线程以外的线程访问
然而我叫'正确'
xxForm.Show()
通过确保它包含在调用调用中
.Invoke(新的 MethodInvoker())
我仍然得到线程问题。我可以做其他所有事情(Focus,BringToFront),这是显示错误。
此外,GUI 永远不会得到浏览器的响应和显示。在 VS 调试器中,我得到了上述线程错误(后台线程的公寓状态 == MTA)。当作为 EXE 运行时,相同的代码具有 STA 的线程 aparement,并且 GUI 在调试时永远不会显示,但如果我直接运行 EXE,则没有线程问题,浏览器控件永远不会响应输入。
Spo的问题是:
- 为什么 VS / EXE 中的行为不同?
- 如何在 VS 中调试?
- BrowserControl 是否可以与多个线程一起使用?
更新
是的,我知道没有代码 - 它太长了。我会看看我能做什么。
另外,请在发布答案之前阅读问题。我在 UI 线程上调用后台线程。那不是问题。这对结果没有影响。我会否决建议的答案。
还有一些希望 - 我已经搜索了很多小时。它链接了消息泵。除非消息泵正在运行,否则不会收到 DocumentCompleted 事件。
更新 2 我管理的最好的是伪代码:
程序:
startWorkQueue
LoadForm (don't show)
线程1:
addToQueue
线程2:
readFromQueue
ShowForm (on occasion)
现在 ShowForm 方法位于 Windows.Form 控件上。在此范围内,任何调用都是通过 Invoke 进行的,因此尽管第二个线程调用 ShowForm,但实际的 .Show() 等调用仍在 UI 线程上。
那么我错过了什么?我只是不明白为什么会有跨线程异常......