C# WPF灵活性与STA线程错误

C# WPF灵活性与STA线程错误,c#,wpf,multithreading,C#,Wpf,Multithreading,我想显示窗口,但我得到一个错误“调用线程必须是STA,因为许多UI组件都需要它”。我找到了解决方案,但每次都写这个很难 Application.Current.Dispatcher.Invoke((Action) delegate { msgBox = new CustomMessageBox( "Файл добавлен в базу, строки " + errors + " не были добавлены по

我想显示窗口,但我得到一个错误“调用线程必须是STA,因为许多UI组件都需要它”。我找到了解决方案,但每次都写这个很难

Application.Current.Dispatcher.Invoke((Action) delegate
{
    msgBox =
        new CustomMessageBox(
            "Файл добавлен в базу, строки " + errors +
            " не были добавлены по причине неверных входных данных",
            "Уведомление");
    msgBox.Show();
});
还有其他解决办法吗?我把CustomMessageBox的代码放在下面

public partial class CustomMessageBox : Window
{
    public CustomMessageBox()
    {
        InitializeComponent();
    }

    public CustomMessageBox(string text, string title)
    {
        InitializeComponent();
        Title = title;
        TextBlock.Text = text;
    }

    private void OkBtn_OnClick(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}

由于WPF应用程序是
STA
应用程序,所有处理UI控件的逻辑都必须在UI线程的上下文中运行。这正是用于将方法调用到UI同步化上下文中的
Dispatcher

我同意你提供的代码不好,所以你必须重构它。我建议您创建一个将在后台运行的方法,返回操作状态,其中可能包括错误代码和警告

代码可以是这样的:

async void btnSave_Click(object sender, EventArgs e)
{
    // get string result of the operation
    var result = await Task.Run(() => SaveTheData());
    if (result != "OK")
    {
        msgBox = new CustomMessageBox(
                    "Файл добавлен в базу, строки " + result +
                    " не были добавлены по причине неверных входных данных",
                    "Уведомление");
        msgBox.Show();
    }
}

我想说的另一件事是,在将用户输入保存到数据库之前,您可能应该检查用户输入,这可以节省他们的时间。

创建一个帮助函数,并在UI线程上异步调用消息框:

static void ThreadSafeMessageBox(String text)
{
  Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(text)));
}

void Test()
{
  Task.Run(() => { ThreadSafeMessageBox("Hi!");});
}

在工作线程中显示消息框很少是一个好主意,这应该很糟糕。如果不是很糟糕,那么几乎每个人都会弄错。改为使用BackgroundWorker或TaskScheduler.FromCurrentSynchronizationContext()。主方法中是否有
STAThread
属性?