C# 调用线程必须是STA,因为许多UI组件在WPF中都需要STA
我的设想:C# 调用线程必须是STA,因为许多UI组件在WPF中都需要STA,c#,wpf,C#,Wpf,我的设想: void Installer1_AfterInstall(object sender, InstallEventArgs e) { try { MainWindow ObjMain = new MainWindow(); ObjMain.Show(); } catch (Ex
void Installer1_AfterInstall(object sender, InstallEventArgs e)
{
try
{
MainWindow ObjMain = new MainWindow();
ObjMain.Show();
}
catch (Exception ex)
{
Log.Write(ex);
}
}
我得到错误“调用线程必须是STA,因为许多UI组件都需要它”
我该怎么办?通常,WPF线程的入口点方法为
线程方法设置了[STAThreadAttribute]
,或者在使用线程.SetApartmentState()创建线程时将单元状态设置为STA
。但是,这只能在线程启动之前设置
如果无法将此属性应用于执行此任务的线程的应用程序入口点,请尝试以下操作:
void Installer1_AfterInstall(object sender, InstallEventArgs e)
{
var thread = new Thread(new ThreadStart(DisplayFormThread));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
private void DisplayFormThread()
{
try
{
MainWindow ObjMain = new MainWindow();
ObjMain.Show();
ObjMain.Closed += (s, e) => System.Windows.Threading.Dispatcher.ExitAllFrames();
System.Windows.Threading.Dispatcher.Run();
}
catch (Exception ex)
{
Log.Write(ex);
}
}
我以前有过这个错误,最简单的方法就是使用。
请参见我的答案和答案
祝你好运[STAThreadAttribute]私有void DisplayFormThread(){try{MainWindow ObjMain=new MainWindow();ObjMain.Show();}catch(Exception ex){Log.Write(ex);}}对不起,我不明白你的评论STAThreadAttribute
可以缩短为STAThread
;这是支持的。这就是你的意思吗?这不起作用,[STAThread]只在程序入口点(Main)上被识别。改为使用Thread.SetApartmentState()。您还必须运行一个消息循环,Application.run()。@user423887-根据Hans Passant的反馈,代码已经更新,上面的内容已经过全面测试,将其粘贴到新的WPF应用程序中可以正常工作。WPF使用dispatcher,我们需要使用它来解决此问题请告诉我为什么这个答案不好,这是我寻求解决方案的本能是的,但我不能,这就是为什么我离开了这个公开的帖子,邀请任何知道这个解决方案有什么问题的人来回答对不起,但是你在谈论哪个答案?我还是彼得!你的。我在这里发表评论。我看不出有什么问题。谢谢Oxiabox,我想版主可以帮助我们!