在程序中调用窗体时,因另一个窗体包含webbrowser,因此在实例化时报错:当前线程不在单线程单元中,因此无法实例化 ActiveX,查找了下网上的一些方法,说的最多的是 在入口添加[STAThread] ,但我一看项目本身默认创建时入口处就有[STAThread] ,所以根本不可行。
最后发现使用委托比较合适。解决代码如下:
//调用处
ParameterizedThreadStart ps = new ParameterizedThreadStart(ShowVerify);
Thread t = new Thread(ps);
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);//关键设置
t.Start(m_url);//传参数
t.Join();//主线程等待,临时线程开始处理
//弹出验证码窗体
private static void ShowVerify(object obj)
{
Frm_Verification frmVerify = new Frm_Verification();
frmVerify.m_url = obj.ToString();
frmVerify.ShowDialog();
}
被调用页面的写法:
private void Frm_Verification_Load(object sender, EventArgs e)
{
GetVerifyImg();
}
public WebBrowser wb = new WebBrowser();
private void GetVerifyImg()
{
bool bl = true;
Invoke(new MethodInvoker(() =>
{
if (wb == null)
{
wb = new WebBrowser();
}
wb.Navigate(m_url);
wb.ScriptErrorsSuppressed = true;
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler((object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
if (wb.ReadyState == WebBrowserReadyState.Complete)
{
//此处为你的逻辑代码
bl = false;
}
});
}));
while (bl)
{
Application.DoEvents();
}
}