c# - 为什么在不同线程中创建窗口时有时会出现 "Invalid window handle"异常

标签 c# wpf multithreading

按照下面的代码创建窗口时,我收到“无效窗口句柄”异常。这是在单独的线程上调用的。它不是每次都会抛出,而是随机发生。另外,我无法查看异常的堆栈跟踪,它显示“{无法计算表达式,因为代码已优化或 native 框架位于调用堆栈的顶部。}

private void ShowDialog()
{
    Thread thread = new Thread(() =>
        {
            waitContainer = MakeSimpleWindow();
            this.waitContainer.Closed += new EventHandler(waitingWindow_Closed);

            waitContainer.ShowDialog();

            System.Windows.Threading.Dispatcher.Run();
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.IsBackground = true;
        thread.Start();
}

public Window MakeSimpleWindow()
    {
        Window w = new Window(); // Exception occurs from here
        w.Title = Attributes[MessageBoxAttribute.message];            
        return w;
    }

最佳答案

两行:

waitContainer.ShowDialog();\    
System.Windows.Threading.Dispatcher.Run();

至少有一个竞争条件。当 ShowDialog 开始执行时,线程尚未运行调度程序。

但答案不是如何解决这个问题。虽然您可以执行 1 个以上的调度程序,但这并不是一个好主意。寻找一个运行 1 个 GUI 线程(主线程)的解决方案,并解决 Invoke 和事件的其他问题。

关于c# - 为什么在不同线程中创建窗口时有时会出现 "Invalid window handle"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21178270/

相关文章:

c# - 关于 XML 文件大小限制

c# - 全选事件 : WPF Datagrid

.net - C#4.0如何将变量传递给线程?

c# - 对 WriteableBitmap 像素的更改不会更新屏幕

c# - 动态更改 C# 中枚举的值?

c# - 如何让 ToolTip 绑定(bind)与 ComboBox 一起工作?

java - 使用单独的线程更新全局 HashMap 时出现空指针异常

c - 如何在 C 中使用 pthread 来防止同时读取和写入磁盘上的文件?

c# - 从文件路径获取字符串而不是路径格式

wpf - 单元测试 : hard dependency MessageBox. Show()