Control.Invoke()卡住了

时间:2013-03-11 08:55:02

标签: c# multithreading backgroundworker invoke

我知道关于这个话题有几个主题,但我认为我的不同。 在我的应用程序中,我打开一个表单,用户可以在其中输入一些用于upcomming打印的参数。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”解雇那个后台工作者。

在该后台工作者中,我需要访问GUI并更改/读取它,所以我需要一个control.Invoke()。 “有时”Invoke一直停留在调用调用本身,并且不执行委托。我的主要线程工作正常,并没有被阻止。我仍然可以与GUI进行其他工作。在发布任何代码之前:是否还有其他条件来执行除

之外的control.Invoke()
  • 主GUI线程未被阻止
  • 控件必须存在,手柄已创建且不会被处理

主线程不需要是空闲的,而且调用的确是正确的吗?一旦主线程空闲,它应该继续......

感谢您的帮助

更新

以下是该问题中的线程情况: enter image description here 主线程正在执行:

Application.Run(appContext);

所以它是空闲的。 工作线程在这一行等待:

fileName = (string)cbPrintFile.Invoke(new Func<String>(() => cbPrintFile.Text));

这不像我上面说的那样执行。 cbPrintFile是一个组合框

1 个答案:

答案 0 :(得分:2)

Invoke是“入队并等待它被处理”。如果它变得“卡住”,那表明你已经死锁,例如因为UI线程仍然在等待工作者的事件处理程序中。如果代码正确解耦,您可以将Invoke替换为BeginInvoke,这允许工作人员在排队工作后继续。当然,确保UI永远不会等待工作人员也是一件好事。如果试图在两个地方持有lock(在同一个物体上),这可能会意外地完成。您可以通过暂停应用程序,按 ctrl + d t 调出线程来调查 ctrl + d c 依次查看每个的调用堆栈。