gpt4 book ai didi

c# - 调用线程必须是 STA,因为在 WPF 中很多 UI 组件都需要这个错误。在 form.show() 上

转载 作者:可可西里 更新时间:2023-11-01 08:53:48 25 4
gpt4 key购买 nike

首先,我在网站上阅读了几个类似问题的答案,但老实说,我觉得它们有点令人困惑(由于我缺乏经验而不是答案!)。我正在使用 FileSystemWatcher() 类来监视正在创建/更改的文件的文件夹。事件发生后,我想在项目中加载另一个表单。当新表单上的构造函数试图执行时,我没有加载表单,而是收到错误。我只使用一个线程 - 我没有尝试在不同的线程下加载表单。我的代码如下

 //MainWindow
public static void FolderWatcher()
{
FileSystemWatcher fsWatcher = new FileSystemWatcher();
fsWatcher.Path = "C:\\dump";
fsWatcher.Filter = "*";
fsWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
fsWatcher.Created += new FileSystemEventHandler(OnChanged);
fsWatcher.EnableRaisingEvents = true;
}

public static void OnChanged(object source, FileSystemEventArgs e)
{
var imagePreview = new ImagePreview();
imagePreview.Show();
}


//SecondForm
public partial class ImagePreview : Window
{
public ImagePreview()
{
InitializeComponent(); //error occurs here
}
}

希望您能提供帮助,在此先感谢您。

最佳答案

使用多少线程并不重要。只有一条规则:您创建 UI 的任何线程都必须是 STA。

如果您只有一个线程,那么这个线程必须是 STA。 :-) 为了使主线程成为 STA,您需要在 Main 上使用 STAThread 属性:

[STAThread]
static void Main(string[] args)
{
// ...

如果您只是创建一个标准的 WPF 应用程序,主线程已经标记了所需的属性,因此不需要更改。

请注意,来自 FileSystemWatcher 的事件可能来自框架内部创建的其他线程。 (您可以通过在 OnChanged 中设置断点来检查这一点。)在这种情况下,您需要将窗口创建转发到 STA 线程。如果您的应用程序是 WPF 应用程序,则按以下方式完成:

public static void OnChanged(object source, FileSystemEventArgs e)
{
var d = Application.Current.Dispatcher;
if (d.CheckAccess())
OnChangedInMainThread();
else
d.BeginInvoke((Action)OnChangedInMainThread);
}

void OnChangedInMainThread()
{
var imagePreview = new ImagePreview();
imagePreview.Show();
}

关于c# - 调用线程必须是 STA,因为在 WPF 中很多 UI 组件都需要这个错误。在 form.show() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com