WPF灵活性与STA线程出错

时间:2016-03-10 11:07:24

标签: c# wpf multithreading

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

Application.Current.Dispatcher.Invoke((Action) delegate
{
    msgBox =
        new CustomMessageBox(
            "Файл добавлен в базу, строки " + errors +
            " не были добавлены по причине неверных входных данных",
            "Уведомление");
    msgBox.Show();
});

还有其他的解决方案吗?我把CustomMessageBoxBelow的代码

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();
    }
}

2 个答案:

答案 0 :(得分:1)

由于WPF应用程序是 anyViewInTheLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 应用程序,因此处理UI控件的所有逻辑必须在UI线程的上下文中运行。这正是STA用于 - 将方法调用到UI同步上下文中。

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

代码可能是这样的:

Dispatcher

我想说的其他事情是你可能应该检查用户输入 之前将其保存到数据库中,这样可以节省时间。

答案 1 :(得分:0)

创建辅助函数并在UI线程上异步调用消息框:

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

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