当需要通知时,我希望打开在线程(而不是主线程)中具有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线程同时运行多个窗体?
发布于 2017-08-13 01:39:41
我偶然解决了问题。只是在“主表单”的Invoke()中创建和调用了弹出表单。也不需要使用STA Thread。这样做可能会产生其他副作用。但是,它看起来很好。
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();
}https://stackoverflow.com/questions/45649956
复制相似问题