Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Control.Invoke()stucks_C#_Multithreading_Backgroundworker_Invoke - Fatal编程技术网

C# Control.Invoke()stucks

C# Control.Invoke()stucks,c#,multithreading,backgroundworker,invoke,C#,Multithreading,Backgroundworker,Invoke,我知道关于这个话题有好几条线索,但我认为我的不同。 在我的应用程序中,我打开了一个表单,用户可以在其中输入一些参数以进行升级打印。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”触发了后台工作程序 在后台工作程序中,我需要访问GUI并更改/读取它,因此我需要一个控件。Invoke()。“有时”调用一直停留在调用本身,不执行委托。我的主线程工作正常,没有阻塞。我仍然可以与GUI交互,做其他事情。在发布任何代码之前:执行控件时是否有任何其他条件。Invoke()除了 主G

我知道关于这个话题有好几条线索,但我认为我的不同。 在我的应用程序中,我打开了一个表单,用户可以在其中输入一些参数以进行升级打印。此打印应该在后台工作程序中运行。所以我用事件“OnFormClosing”触发了后台工作程序

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

  • 主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读取值,则不会返回该值。