“调用线程必须是STA,因为很多UI组件都需要这个。”

问题描述 投票:0回答:3

我正在尝试用纯 C# 打开一个窗口。 为此,我创建了一个窗口构造函数 (

SGFWindow
),从
Window
扩展了
System.Windows
类:

namespace SGF
{
    public partial class SGFWindow : Window
    {
        public SGFWindow() 
        {
            this.Title = "SGF Window";
            this.Width = 200;
            this.Height = 200;
        }
    }
}

然后我创建了一个

WindowTest
类来测试它:

namespace SGF
{
    public class WindowTest
    {
        public static void Main(string[] args)
        {
            SGFWindow window = new SGFWindow();
            window.Show();
        }
    }
}

问题是,我收到“调用线程必须是 STA,因为许多 UI 组件都需要这个”。错误 ;只不过这不是一个线程(或者不是我创建的线程?)。

我搜索了它,但它总是关于一个线程,我找不到如何修复这个错误。我也看到过一些关于

[STAThread]
的内容,但显然不合适。

提前致谢, 马索。

c# wpf multithreading sta
3个回答
7
投票
实际上,有一个线程,因为执行代码需要线程。事实上,总会有至少一个:操作系统会为你创建一个来执行

Main 方法,这个线程被称为“主线程”。当 Main

 返回时,该线程退出。
默认情况下,该线程被创建为 MTA,但这不适用于 WinForms 和 WPF,因此您会收到该错误。解决方案是将 
STAThread

属性放在

Main

 上以更改此设置:
[STAThread]
public static void Main(string[] args)
{
    SGFWindow window = new SGFWindow();
    window.Show();
}

该属性仅用于更改主线程的线程模型。对于您自己创建的线程,请使用
Thread.SetApartmentState


此外,如果您使用

0
投票
来运行 WPF/WinForms 应用程序,您需要调用:

Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

github/dotnet/winforms问题中提到的

原因是top level statements class

不能像标准程序/主方法一样应用任何属性,没有办法编写[STAThread]。


您可以使用 Appartment .STA 创建一个新线程。

-1
投票
Thread thread = new Thread(() => FantasticMethod()); thread.SetApartmentState(ApartmentState.STA); thread.Start();

在线程中你可以放置你的方法。
我现在不确定,但你也可以使用:

Application.Current.Dispatcher.Invoke(() => FantasticMethod());

错误意味着您必须处于 UI 线程中
希望这对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.