【问题标题】:Winforms .net 4.7 application frozen in OnUserChanged SystemEventWinforms .net 4.7 应用程序在 OnUserChanged SystemEvent 中冻结
【发布时间】:2018-08-03 07:33:11
【问题描述】:

我有一个 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);

我尝试关注this post 我收到的其中一个内存转储,但使用windbg 无法通过第二步

我放弃了,接下来按照here的建议进行操作

我被授予访问有问题的客户端计算机的权限,当它冻结时,使用 spy++ 获得以下结果...

按照帖子中的建议,我扩展了线程并寻找第二个线程

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

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

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

提前感谢您提供任何信息

[更新1]

看起来 Spyxx 和 Visual Studio(调试)中的线程 ID 根本不匹配。我在本地机器上运行我的应用程序(所以我可以看到我有哪些 Windows inb spyxx),我可以在这两个地方识别我的主 UI 线程,并且它们具有完全不同的 id...

无论如何,我可以在 spy++ 中看到,我的主应用程序 UI 线程有一个窗口,另外一个线程下还有两个额外的窗口...

我也不确定这个是什么。当我进入属性(通过 spy++)时,我可以看到其中一个窗口的标题为 .NET-BroadcastEventWindow.4.0.0.0.3f2ddb3.0,另一个只是显示 Default IME

有谁知道这些是什么(谷歌搜索并没有带来太多......但是)

无论如何,我没有问题实例所具有的 TabletPenServiceHelperClass。

【问题讨论】:

  • 您搜索过Wisptis.exe(通常是\System32)吗? Windows ink Services 的一部分。可以在启动时执行,也可以与一些众所周知的程序(例如 Adob​​e Reader)结合使用。使用TabletPenServiceHelperClass 可以成为 Windows OOBE (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE) 的一部分,请参阅:Customize the Out of Box Experience (OOBE)。删除 .exe 并重试。

标签: c# .net multithreading winforms


【解决方案1】:

SystemEvent.OnUserPreferencesChanged 冻结通常可以通过锁定 (Win+L) 而不是解锁 Windows 屏幕来重现。

请尝试从this answer 调用 CheckSystemEventsHandlersForFreeze() 方法(在冻结之前甚至之后!)以找出最初在错误(非 UI,通常是线程池)线程上创建的特定控件,从而导致冻结。

【讨论】:

    【解决方案2】:

    我终于发现了我的问题。我必须使用 MS 支持,并使用转储文件,他们能够确定我在工作线程上创建的窗口的位置。查看代码,我的猜测是我有一个 InvokeRequired 失败,因为它在被调用的控件有窗口句柄之前被调用。

    我现在总是在主应用程序窗口上调用InvokeRequired,但是错过了一个嵌套非常深的。

    如果您有这种情况,即在工作线程上创建一个窗口,则 OnUserPreferencesChanged 稍后会导致此冻结。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2015-05-09
      相关资源
      最近更新 更多