1

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

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

  • 主 GUI 线程未被阻塞
  • contorl 必须存在,句柄已创建且不被释放

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

谢谢你的帮助

更新:

这是该问题期间的线程情况: 在此处输入图像描述 主线程正在执行此操作:

Application.Run(appContext);

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

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

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

4

1 回答 1

3

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

于 2013-03-11T09:01:31.190 回答