首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#创建线程中具有webBrowser的窗体

c#创建线程中具有webBrowser的窗体
EN

Stack Overflow用户
提问于 2017-08-12 11:54:23
回答 1查看 765关注 0票数 2

当需要通知时,我希望打开在线程(而不是主线程)中具有webBrowser控件的小弹出窗体。

只需在线程中运行弹出表单,得到错误。

代码语言:javascript
复制
ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be 
instantiated
because the current thread is not in a single-threaded apartment.

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

代码语言:javascript
复制
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线程同时运行多个窗体?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 01:39:41

我偶然解决了问题。只是在“主表单”的Invoke()中创建和调用了弹出表单。也不需要使用STA Thread。这样做可能会产生其他副作用。但是,它看起来很好。

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45649956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档