c# 创建在线程中具有 webBrowser 的表单

c# Create forms that have webBrowser in thread

我想在需要提醒时在线程(不是主线程)中打开具有 webBrowser 控件的小型弹出窗体。

只是运行线程中的弹出表单,出现错误

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be 
instantiated
because the current thread is not in a single-threaded apartment.

所以,我把线程设置成STA模式,没有报错。但是,当有多个弹出窗口需要 运行 时,它们会一一显示。在我关闭第一个弹出窗口之前,第二个弹出窗口不会出现。等等.. 我想在线程中同时显示每个弹出窗口。

private void timer1_Tick(object sender, EventArgs e)
{
    Thread th = new Thread(() =>
    {
        var arts = _Moniter.Mon();
        if (arts.Count < 1) return;

        foreach (var art in arts)
        {
            var f = new FormPopup(art, FormPopup.POPUP_MODE.NORMAL, Color.Yellow, 30000);
            Application.Run(f);
        }
    });
    th.SetApartmentState(ApartmentState.STA);   // 
    th.IsBackground = true; // 
    th.Start();
}

有没有办法在没有STA线程的情况下显示有webBrowser的表单? 或者如何使用 STA 线程同时 运行 多个表单?

我偶然自己解决了问题。刚刚在 "Main form" 的 Invoke() 中创建并调用了弹出窗体。也不需要使用 STA 线程。这样做可能会产生其他副作用。但是,它看起来工作正常。

private void timer1_Tick(object sender, EventArgs e)
{
    Thread th = new Thread(() =>
    {
        foreach (var art in arts)
        {
            this.Invoke((MethodInvoker)(() =>   // It works!
            {
                var f = new FormPopup(art, FormPopup.POPUP_MODE.NORMAL, Color.Yellow, 30000);
                f.Show();
            }));
        }
    });
    th.IsBackground = true; // 
    th.Start();
}