[英]Control.Invoke() stucks
我知道有几个与此主题相关的主题,但我认为我是不同的。 在我的应用程序中,我打开一个表单,用户可以在其中输入一些参数以进行即将进行的打印。 该打印应在后台工作人员中进行。 因此,我使用事件“ OnFormClosing”解雇了该后台工作人员。
在该后台工作人员中,我需要访问GUI并进行更改/读取,因此我需要一个control.Invoke()。 “有时”,Invoke一直停留在本身的调用调用中,并且不执行委托。 我的主线程工作正常,没有被阻塞。 我仍然可以与GUI交互以执行其他操作。 在发布任何代码之前:除了执行控件之外还有其他条件吗?
主线程不需要是免费的,确切的调用称为正确吗? 一旦主线程空闲,它应该继续。
谢谢你的帮助
更新:
这是该问题期间的线程情况: 主线程正在执行此操作:
Application.Run(appContext);
因此它是空闲的。 工作线程正在等待以下行:
fileName = (string)cbPrintFile.Invoke(new Func<String>(() => cbPrintFile.Text));
不会像我上面所述的那样执行。 cbPrintFile
是一个组合框
Invoke
是“排队等待处理”。 如果它变得“卡住”,则表明您已死锁,例如,因为UI线程仍在等待工作者的事件处理程序中。 如果代码正确BeginInvoke
,则可以用BeginInvoke
替换Invoke
,这使工作人员可以在排队工作后继续。 当然,确保UI永远不会等待工作人员也将是一件好事。 如果试图在两个地方都同时握住lock
(在同一对象上),则可能会意外地这样做。 您可以通过暂停应用程序,按ctrl + d , t调出线程,按ctrl + d , c依次查看每个线程的调用堆栈来进行调查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.