Winforms .net 4.7 应用程序在 OnUserChanged SystemEvent

我有一个 Winforms 应用程序,它部署在许多客户端站点上,并且运行没有问题。

我有一个站点(实际上一秒钟刚刚报告了它),其中应用程序将无缘无故地冻结。

我们通过小型转储获得的事件单堆栈跟踪显示 OnUserChanged 事件中的冻结...

http://img.mukewang.com/6190795e00012f1203740354.jpg

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++ 获得以下结果......

http://img3.mukewang.com/619079690001eff305330570.jpg

正如帖子中所建议的,我扩展了线程并寻找了第二个线程

我可以看到里面有两个带窗户的线程。查看我同时进行的内存转储,因此我可以匹配线程 ID),这两个线程都只是未命名的工作线程(我无法在窗口中看到主 UI 线程)

带有TabletPenServiceHelperClass 的那个看起来不寻常,我找不到太多关于它的信息。

有没有人对从这里去哪里有任何建议,或者TabletPenServiceHelperClass是什么,这与这些冻结有什么关系吗?这是一个令人沮丧的问题。

提前感谢您提供任何信息


湖上湖
浏览 245回答 2
2回答

牧羊人nacy

我终于在我的案例中找到了问题。我不得不使用 MS 支持,并使用转储文件,他们能够确定我在工作线程上创建的窗口的位置。查看代码,我的猜测是我有一个InvokeRequired失败,因为它在调用它的控件有一个窗口句柄之前被调用。我现在总是InvokeRequired在主应用程序窗口上调用,但是错过了一个嵌套很深的窗口。如果您遇到这里的情况,即在工作线程上创建一个窗口,则 OnUserPreferencesChanged 稍后会导致此冻结。

达令说

SystemEvent.OnUserPreferencesChanged 冻结通常可以通过锁定 (Win+L) 而不是解锁 Windows 屏幕来重现。请尝试从此答案中调用 CheckSystemEventsHandlersForFreeze() 方法(在冻结之前甚至之后!)以找出最初在错误(非 UI,通常是线程池)线程上创建的特定控件,从而导致冻结。
打开App,查看更多内容
随时随地看视频慕课网APP