C# Control.Invoke()stucks
我知道关于这个话题有好几条线索,但我认为我的不同。 在我的应用程序中,我打开了一个表单,用户可以在其中输入一些参数以进行升级打印。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”触发了后台工作程序 在后台工作程序中,我需要访问GUI并更改/读取它,因此我需要一个控件。Invoke()。“有时”调用一直停留在调用本身,不执行委托。我的主线程工作正常,没有阻塞。我仍然可以与GUI交互,做其他事情。在发布任何代码之前:执行控件时是否有任何其他条件。Invoke()除了C# Control.Invoke()stucks,c#,multithreading,backgroundworker,invoke,C#,Multithreading,Backgroundworker,Invoke,我知道关于这个话题有好几条线索,但我认为我的不同。 在我的应用程序中,我打开了一个表单,用户可以在其中输入一些参数以进行升级打印。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”触发了后台工作程序 在后台工作程序中,我需要访问GUI并更改/读取它,因此我需要一个控件。Invoke()。“有时”调用一直停留在调用本身,不执行委托。我的主线程工作正常,没有阻塞。我仍然可以与GUI交互,做其他事情。在发布任何代码之前:执行控件时是否有任何其他条件。Invoke()除了 主G
- 主GUI线程未被阻止
- contorl必须存在,句柄已创建且不能释放
Application.Run(appContext);
所以它是空闲的。
工作线程正在此行等待:
fileName = (string)cbPrintFile.Invoke(new Func<String>(() => cbPrintFile.Text));
fileName=(string)cbPrintFile.Invoke(newfunc(()=>cbPrintFile.Text));
而不是像我上面所说的那样执行
cbPrintFile
是一个组合框Invoke
是“排队等待处理”。如果它变得“卡住”,则表明您已经死锁,例如,因为UI线程仍在事件处理程序中等待工作线程。如果代码已正确解耦合,您可能可以将调用
替换为开始调用
,这样工作人员可以在排队完成工作后继续。当然,最好确保UI永远不会等待工作人员。如果试图在两个位置保持锁
(在同一对象上),可能会意外地执行此操作。您只需暂停应用程序,按ctrl+d,t打开线程,按ctrl+d,c依次查看每个线程的调用堆栈即可进行调查。您应该使用ReportProgress
事件处理程序等向UI线程报告。看。你说你正在打开一个表单,然后用OnFormClosing
方法启动后台工作人员。然后使用control.Invoke()
更新哪些控件?如果您试图更新试图关闭的表单,这可能是您的问题的一部分…+1只是因为标题与“Control.Invoke()糟糕透顶”。@DanPuzey否,因为没有后台工作人员,它就可以works@Killercam我不想向UI报告任何进展,只是读取并设置一些GUI字段“如果代码正确地去耦合,你可能会用BeginInvoke替换调用”,请澄清我的疑问。我更新了我的帖子以显示实际情况。我同意,如果主线程忙,这将阻止它,但事实并非如此。“BeginInvoke”“解决不了这个问题吗?因为它也会留在那里,永远不会像现在这样被执行。此外,如果需要从GUI读取值,则不会返回该值。