【发布时间】:2018-06-08 09:45:13
【问题描述】:
我正在使用BackGroundWorker 访问一些数据并读取它。但是我需要在读取数据的代码中打开一个新的 wpf 窗口。 (synchronous)
执行此操作时出现错误。
我尝试在打开新窗口的函数上方添加[STAThread],但这不起作用。
打开新窗口的方法:
[STAThread]
int returnColumnStartSelection(string filePath)
{
ColumnStartSelection css = new ColumnStartSelection(filePath);
css.ShowDialog();
return css.lineStart;
}
新窗口的入口点:
public ColumnStartSelection(string filePath)
{
InitializeComponent();
//
this.Topmost = true;
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}
【问题讨论】:
-
不要在后台线程上创建和显示窗口。相反,使用主窗口的 Dispatcher 来调用显示辅助窗口的操作。
-
您收到的异常消息告诉您,您正在尝试在工作线程上运行不是线程安全的代码。解决方法是不尝试绕过消息,使用Application.Current.Dispatcher.BeginInvoke()来保证代码安全。
-
BGW 已创建,因此您不要必须从后台线程修改 UI。这就是进度事件的用途。 BGW 本身已经过时了,因为您可以使用 Tasks、
Task.Run、async/await 和IProgress<T>来构建更复杂的异步方法 -
顺便说一句,有几十个重复的问题。问题不在于 STAThread。 No 操作系统允许一个线程修改由另一个 线程创建的 UI。每个窗口没有“入口点”,只有一个处理所有窗口的消息泵。
-
根本没有帮助我。不过谢谢。
标签: c# wpf multithreading backgroundworker