【问题标题】:How do I call a WindowsForm inside a class/Thread in c#如何在 c# 的类/线程中调用 Windows 窗体
【发布时间】:2015-09-12 12:56:04
【问题描述】:

System.Windows.Forms.dll webbrowser 控件中出现“System.Threading.ThreadStateException”类型的未处理异常

我正在尝试捕获视频的帧,然后在单独的线程中处理它们。处理完框架后,我需要调用一个包含 webBrowser 控件的表单,以将网页显示为第一个 winform 的覆盖层。

有什么办法可以在我用来处理帧的类中调用这个表单。如果我这样做了,我会一直被上述异常所困扰。

我在 SO 和其他论坛上进行了研究,但找不到任何解决此问题的方法。这是我的代码:

  class FrameProcessor
        {
//This line results in the above stated Exception.
webForm frm=new webForm ();
frm.Show();
 }

有什么解决办法吗?任何建议将不胜感激。

【问题讨论】:

标签: c# multithreading winforms


【解决方案1】:

您只能使用 UI 线程创建/调用 UI 代码(将在屏幕上呈现的代码)。所以你需要在 UI 线程上“调用”这段代码。

您的线程需要引用一些 winform 或控件,例如,您可以创建一个方法。

您将此添加到您的“第一个 winform”(正如您在问题中提到的那样)。

public void Launch(){
  Invoke((MethodInvoker) delegate {
    webForm frm=new webForm ();
    frm.Show();
   });
}

现在只要您的非 UI 线程可以访问具有上述方法的 winform,您就可以调用它。

【讨论】:

  • 虽然答案很好,BeginInvoke() 可以说更好
  • @T McKeown:如果你能告诉我如何在非 UI 线程中调用这个方法,那就太好了。
【解决方案2】:

在我的情况下,这是解决方案:

if (Application.OpenForms.OfType<webForm>().Count() == 0)
                      ().First().Show();
                    {
                     webForm frm = new webForm();
                     frm.Show();
                     }

                    Application.Run();
                }
                else
                {
                    if (Application.OpenForms.OfType<webForm>().Count() == 1)
                    {
                        Form fc = Application.OpenForms["webForm"];

                        if (fc != null)
                            fc.Invoke(new MethodInvoker(delegate { fc.Close(); }));


         }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多