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();
}
我想在需要提醒时在线程(不是主线程)中打开具有 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();
}