我正在尝试用纯 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]
的内容,但显然不合适。
提前致谢, 马索。
Main
方法,这个线程被称为“主线程”。当 Main
返回时,该线程退出。
默认情况下,该线程被创建为 MTA,但这不适用于 WinForms 和 WPF,因此您会收到该错误。解决方案是将
STAThread
属性放在 Main
上以更改此设置:
[STAThread]
public static void Main(string[] args)
{
SGFWindow window = new SGFWindow();
window.Show();
}
该属性仅用于更改主线程的线程模型。对于您自己创建的线程,请使用 Thread.SetApartmentState
。此外,如果您使用
Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
如github/dotnet/winforms问题中提到的。
原因是top level statements class
您可以使用 Appartment .STA 创建一个新线程。
Thread thread = new Thread(() => FantasticMethod());
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
在线程中你可以放置你的方法。我现在不确定,但你也可以使用:
Application.Current.Dispatcher.Invoke(() => FantasticMethod());
错误意味着您必须处于 UI 线程中希望这对您有帮助