WPF创建独立日志窗口时遇到的阻塞与STA线程错误问题求助
WPF创建独立日志窗口时遇到的阻塞与STA线程错误问题求助
大家好,我正在开发一个WPF应用,想要实现一个独立的日志窗口——当某个操作启动时,这个窗口能通过ObservableCollection捕获事件并实时更新日志内容。但目前遇到了两个棘手的问题,想请教各位:
问题1:窗口打开后阻塞主线程
当我用以下代码打开日志窗口时,程序会卡在窗口打开的状态,直到我手动关闭窗口,RunTestButton里的后续代码和异步任务才会继续执行。我知道ShowDialog()本身是阻塞式的,但不确定是不是我的实现思路有问题?
private async void RunTestButton(object sender, RoutedEventArgs e) { OpenLoggingWindow(); // ...后续需要执行的代码 } private void OpenLoggingWindow() { bool windowOpen = false; foreach (LoggingWindow window in Application.Current.Windows.OfType<LoggingWindow>()) { if (window.IsActive == true) { windowOpen = true; break; } } if (!windowOpen) { LoggingWindow newLogWindow = new LoggingWindow(observableCollection); newLogWindow.ShowDialog(); } }
问题2:异步启动窗口时触发STA线程错误
后来我尝试把打开窗口的逻辑放到Task里异步执行,想避免主线程阻塞,结果在窗口的构造函数里直接抛出了The calling thread must be STA, because many UI components require this.的错误,导致程序崩溃。我对线程和Task的细节不太熟悉,也不太清楚STA的具体含义。
private async void RunTestButton(object sender, RoutedEventArgs e) { await OpenLoggingWindow(); // ...后续需要执行的代码 } private async Task OpenLoggingWindow() { bool windowOpen = false; foreach (LoggingWindow window in Application.Current.Windows.OfType<LoggingWindow>()) { if (window.IsActive == true) { windowOpen = true; break; } } if (!windowOpen) { await Task.Run(() => { LoggingWindow newLogWindow = new LoggingWindow(observableCollection); newLogWindow.ShowDialog(); }); } }
补充说明:这个日志窗口的逻辑很简单,就是接收一个ObservableCollection作为私有变量,用来绑定更新DataGrid的日志条目。目前优先想解决窗口正常打开、主线程不阻塞、日志能实时更新这几个核心问题,代码优化的事之后再处理。
内容来源于stack exchange
相关产品推荐
相关产品推荐

