我知道关于这个话题有几个主题,但我认为我的不同。 在我的应用程序中,我打开一个表单,用户可以在其中输入一些用于upcomming打印的参数。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”解雇那个后台工作者。
在该后台工作者中,我需要访问GUI并更改/读取它,所以我需要一个control.Invoke()。 “有时”Invoke一直停留在调用调用本身,并且不执行委托。我的主要线程工作正常,并没有被阻止。我仍然可以与GUI进行其他工作。在发布任何代码之前:是否还有其他条件来执行除
之外的control.Invoke()主线程不需要是空闲的,而且调用的确是正确的吗?一旦主线程空闲,它应该继续......
感谢您的帮助
更新
以下是该问题中的线程情况: 主线程正在执行:
Application.Run(appContext);
所以它是空闲的。 工作线程在这一行等待:
fileName = (string)cbPrintFile.Invoke(new Func<String>(() => cbPrintFile.Text));
这不像我上面说的那样执行。 cbPrintFile
是一个组合框
答案 0 :(得分:2)
Invoke
是“入队并等待它被处理”。如果它变得“卡住”,那表明你已经死锁,例如因为UI线程仍然在等待工作者的事件处理程序中。如果代码正确解耦,您可以将Invoke
替换为BeginInvoke
,这允许工作人员在排队工作后继续。当然,确保UI永远不会等待工作人员也是一件好事。如果试图在两个地方持有lock
(在同一个物体上),这可能会意外地完成。您可以通过暂停应用程序,按 ctrl + d , t 调出线程来调查 ctrl + d , c 依次查看每个的调用堆栈。