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