我有一个 Winforms 应用程序,它部署在许多客户端站点上,并且运行没有问题。我有一个站点(实际上一秒钟刚刚报告了它),其中应用程序将无缘无故地冻结。我们通过小型转储获得的事件单堆栈跟踪显示 OnUserChanged 事件中的冻结...ViewManager.RunApplication 是我调用的Application.Run(m_mainFrame.Form);地方,其中 m_mainForm 是我的主要应用程序表单。我发现了很多关于这个的帖子和各种建议,例如自定义启动画面 - 我删除了这个 - 没有区别,订阅应用启动附近的 Microsoft.Win32.SystemEvents* 事件,如下所示 [STAThread] static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Thread.CurrentThread.Name = "My App"; // Empty handler to try and stop freeze Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; Microsoft.Win32.SystemEvents.DisplaySettingsChanging += SystemEvents_DisplaySettingsChanging; Microsoft.Win32.SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; // Must be called before first window creation: Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);我试图在我得到的内存转储之一上关注这篇文章,但无法通过 Windbg 完成第二步我放弃了这个,接下来按照这里的建议我被允许访问有问题的客户端机器,当它冻结时,使用 spy++ 获得以下结果......正如帖子中所建议的,我扩展了线程并寻找了第二个线程我可以看到里面有两个带窗户的线程。查看我同时进行的内存转储,因此我可以匹配线程 ID),这两个线程都只是未命名的工作线程(我无法在窗口中看到主 UI 线程)带有TabletPenServiceHelperClass 的那个看起来不寻常,我找不到太多关于它的信息。有没有人对从这里去哪里有任何建议,或者TabletPenServiceHelperClass是什么,这与这些冻结有什么关系吗?这是一个令人沮丧的问题。提前感谢您提供任何信息
2 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
我终于在我的案例中找到了问题。我不得不使用 MS 支持,并使用转储文件,他们能够确定我在工作线程上创建的窗口的位置。查看代码,我的猜测是我有一个InvokeRequired
失败,因为它在调用它的控件有一个窗口句柄之前被调用。
我现在总是InvokeRequired
在主应用程序窗口上调用,但是错过了一个嵌套很深的窗口。
如果您遇到这里的情况,即在工作线程上创建一个窗口,则 OnUserPreferencesChanged 稍后会导致此冻结。
- 2 回答
- 0 关注
- 230 浏览
添加回答
举报
0/150
提交
取消