C# 运行多个UI线程

C# 运行多个UI线程,c#,winforms,multithreading,geckofx,message-pump,C#,Winforms,Multithreading,Geckofx,Message Pump,跳到问题的底部;这只是一些额外的信息 我正在使用一个组件(GeckoFX)来呈现一些网站,很好,但它只能在Windows窗体中使用;因为它必须绑定到可以绘制的WinForms对象。因为所有WinForms都在同一个线程中运行,所以我一次只能使用一个GeckoFX实例;所以我决定以WinForm的形式创建一个“worker类”,并在其中添加所有逻辑。表单不需要与主表单通信 现在我可以启动10个窗口,它们最终会工作,但是每个新窗体都会在其他窗体处理完所有GeckoFX事件之前等待,因为不能在一个线程

跳到问题的底部;这只是一些额外的信息

我正在使用一个组件(GeckoFX)来呈现一些网站,很好,但它只能在Windows窗体中使用;因为它必须绑定到可以绘制的WinForms对象。因为所有WinForms都在同一个线程中运行,所以我一次只能使用一个GeckoFX实例;所以我决定以WinForm的形式创建一个“worker类”,并在其中添加所有逻辑。表单不需要与主表单通信

现在我可以启动10个窗口,它们最终会工作,但是每个新窗体都会在其他窗体处理完所有GeckoFX事件之前等待,因为不能在一个线程上使用多个实例。此外,浏览器必须位于UIThread上。因此:

是否可以创建多个UI线程(每个表单一个)?

我见过有人这样做([编辑:删除“坏”链接]),但从来没有人能让他的代码样本正常工作。让它工作的人最初使用某种形式的自定义消息泵来做这种事情,但我不知道如何实现这样的效果。

使用Application.DoEvent()。

创建多线程形式:

    Thread form2Thread;
    Form2 form2;

    private void Form1_Load(object sender, EventArgs e)
    {
        form2Thread = new Thread(RunForm2);
        form2Thread.SetApartmentState(ApartmentState.STA);
        form2Thread.Name = "Form2 Thread";   // looks nice in Output window
        form2Thread.Start();
    }

    public void RunForm2()
    {
        form2 = new Form2();
        Application.Run(form2);
    }

看来这是可能的

我在thread/message pump#2上创建了一个新的Form1:

第二个窗口响应鼠标单击等


我还没有验证是否一切正常,我正在使用的免费Visual Studio Express版缺少“线程”调试窗口,嗯哼。所以我有点茫然。不过,这似乎奏效了。让我知道:-)。

我不认为您所问的是您真正想要的,但为每个线程创建消息泵很容易,您只需调用应用程序。为每个线程运行一次

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Thread t1 = new Thread(Main_);
        Thread t2 = new Thread(Main_);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();
    }

    static void Main_()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
螺纹t1=新螺纹(主螺纹);
螺纹t2=新螺纹(主螺纹);
t1.Start();
t2.Start();
t1.Join();
t2.连接();
}
静态空芯主管道()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form1());
}
}

GeckoFx不需要表单

GeckoWebBrowser wb = new GeckoWebBrowser();
wb.CreateControl(); //<-- the magic lays here!
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); };
wb.Navigate("http://mysite.com");
GeckoWebBrowser wb=新的GeckoWebBrowser();

wb.CreateControl()//这不是非模态的意思,它已经做了一些事情,但是不起作用,因为从一个UIThread创建新的UIThread会产生奇怪的行为。这是我一直在寻找的,但GeckoFX现在抱怨内存访问冲突,现在我将继续运行我的单线程:-)注意,运行消息循环不需要创建表单——只需在线程上使用无参数即可。
GeckoWebBrowser wb = new GeckoWebBrowser();
wb.CreateControl(); //<-- the magic lays here!
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); };
wb.Navigate("http://mysite.com");