C# Windows窗体生成在第二个线程中失败
首先,我的问题是: 我尝试在后台工作程序中构建winform。此表单类仅包含一个webbrowser控件。表单不会生成并跳出到主线程。 我在Visual Studio 2013 Pro和WinForms上使用c#with.NET 4.5 我所做的: 启动后台工作程序C# Windows窗体生成在第二个线程中失败,c#,winforms,webbrowser-control,.net-4.5,backgroundworker,C#,Winforms,Webbrowser Control,.net 4.5,Backgroundworker,首先,我的问题是: 我尝试在后台工作程序中构建winform。此表单类仅包含一个webbrowser控件。表单不会生成并跳出到主线程。 我在Visual Studio 2013 Pro和WinForms上使用c#with.NET 4.5 我所做的: 启动后台工作程序 private void bt_dashboard_chat_Click(object sender, EventArgs e) { if (!this.bw_webchat.IsBusy)
private void bt_dashboard_chat_Click(object sender, EventArgs e)
{
if (!this.bw_webchat.IsBusy)
{
this.bw_webchat.RunWorkerAsync(this.auth.getUserName());
}
}
工人
{
String name = e.Argument as String;
DashBoard.Forms.Chat.DummyChat tmp = new Forms.Chat.DummyChat(name);
tmp.ShowDialog();
}
表单构造函数
InitializeComponent();
this.wb_twitchchat.Url = new Uri("http://link.tld/" + name + "/chat");
this.Text = "Chat of " + name;
这个问题。线程在InitializeComponent()处跳出;在线
this.wb_twitchchat = new System.Windows.Forms.WebBrowser();
这是第二条线
有人知道为什么会这样吗?其他窗体在backgroundworker线程中工作正常://p>异常由后台工作程序本身捕获。使用try/catch块替换您提到的“工作者”代码 捕获的异常应该类似于: 无法实例化ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中 例外情况基于以下代码:
private void button1_Click(object sender, EventArgs e)
{
var bw = new BackgroundWorker();
bw.DoWork += BwOnDoWork;
bw.RunWorkerAsync();
}
private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
try
{
WebBrowser wb = new WebBrowser();
}
catch (Exception ex)
{
}
}
我的意思是,在这一行(this.wb_twitchchat=new System.Windows.Forms.WebBrowser();)之后,将跳过其余部分,不发生任何事情,并返回主线程。然后它可能会引发异常。您是否检查了输出窗口中是否存在异常,可能是未中断执行的异常?忘记检查输出:/System.Windows.Forms.dll中的输出:“System.Threading.ThreadStateException”有什么想法吗?^^我用try catch捕获了该异常,并得到以下消息:Das ActiveX Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2不适用于aktuelle单线程公寓的werden。“很抱歉出现德国异常消息,不知道如何更改。Ok找到了一个解决方案:后台工作程序不支持ApartmentState.STA,因此我需要切换到带有SetApartmentState(ApartmentState.STA)的普通线程;现在它工作得很好。问题是Webbrowser控件需要ApartmentState.STA.thx进行回复。是的,你的权利。用线程找到一个解决方案。删除所有backgroundworker内容,并使用SetApartmentState(ApartmentState.STA)添加一个新线程。现在还可以:)