Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用线程必须是STA,因为许多UI组件在WPF中都需要STA_C#_Wpf - Fatal编程技术网

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,我想版主可以帮助我们!