繁体   English   中英

Control.Invoke()卡住

[英]Control.Invoke() stucks

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

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

  • 主GUI线程未被阻止
  • 控制必须存在,必须创建手柄并且不能将其丢弃

主线程不需要是免费的,确切的调用称为正确吗? 一旦主线程空闲,它应该继续。

谢谢你的帮助

更新:

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

Application.Run(appContext);

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM