8

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

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

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

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

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

4

4 回答 4

9

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

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());
    }
}
于 2009-10-14T23:01:02.410 回答
3

GeckoFx 不需要表格。

GeckoWebBrowser wb = new GeckoWebBrowser();
wb.CreateControl(); //<-- the magic lays here!
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); };
wb.Navigate("http://mysite.com");
于 2010-12-14T06:02:02.680 回答
2

使用 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);
    }
于 2009-10-14T22:51:28.327 回答
1

似乎有可能。

我使用了backgrounder,打开了 TestApp,并在线程/消息泵 #2 上创建了一个新的 Form1:

private void button2_Click(object sender, EventArgs e) {
    helper.Background(() => {
        Form1 form2 = new Form1();
        form2.Show();
    });
}

第二个窗口响应鼠标点击等。

还没有真正验证一切是否正确,我正在使用的免费 Visual Studio Express Edition 缺少“线程”调试窗口,咳咳。所以我有点不知所措。不过,它似乎有效。让我知道 :-)。

于 2009-10-14T22:55:30.650 回答