我有一个应用程序(基于XNA项目模板),它在开头显示一个窗口,以便用户可以更改某些设置。之后,Window关闭,程序在XNA管理的另一个窗口中继续。差不多正好在15分钟之后,程序在一个名为Win32的线程中崩溃,该线程不是主线程(但我从未产生过),并且存在访问冲突。
使用标准调试器甚至没有堆栈跟踪。使用本机调试器时,它仅显示访问冲突发生在Kernel32!BaseThreadInitThunk
中,这是一种未记录的方法。与此同时,主线程似乎仍然乐于执行主游戏循环。
请记住,该应用程序是一个纯粹的C#应用程序,所以这真让我感到困惑。
经过一些测试后,我发现如果我显示一个空窗口,就会发生这种情况:
Window window = new Window();
window.ShowDialog();
因此,在我的代码中删除上面两行会使程序完全稳定。添加它们可确保在15分钟(+ - 30秒)后发生访问冲突。
我已经检查过产生窗口的主线程是一个STA线程。我也尝试手动启动调度程序,但这似乎没有帮助(调度似乎已经在运行),我甚至试图在我显示窗口后关闭调度程序,也没有效果。
我还尝试使用在this answer中描述的多个线程中显示窗口的技术来显示窗口。但这也没有效果。我甚至尝试启动一个完全独立的线程来显示窗口(使用相同的技术)。这也没有效果。
这两行代码怎么能让我的程序在15分钟后崩溃?可能需要对空的标准窗户进行什么样的清理?
答案 0 :(得分:0)
因为没有正确处理对象而听起来与内存相关的问题......