首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winforms .net 4.7应用程序冻结在OnUserChanged SystemEvent中

Winforms .net 4.7应用程序冻结在OnUserChanged SystemEvent中
EN

Stack Overflow用户
提问于 2018-08-03 07:33:11
回答 2查看 465关注 0票数 0

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

我有一个网站(实际上第二个已经报告了),在那里,应用程序会毫无理由地冻结。

事件单堆栈跟踪我们通过一个迷你转储显示冻结在OnUserChanged事件..。

ViewManager.RunApplication是我称之为Application.Run(m_mainFrame.Form);的地方,m_mainForm是我的主要申请表格。

我在这方面发现了许多帖子,还有各种各样的建议,例如自定义启动屏幕--我删除了它--没有区别,订阅Microsoft.Win32.SystemEvents*事件,如下面所示

代码语言:javascript
复制
    [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++获得以下结果.

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

我能看到两个有窗户的线程。查看我同时执行的内存转储,以便匹配线程did ),这两个线程都只是未命名的工作线程(在窗口中看不到主UI线程)。

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

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

谢谢您提供的任何信息

UPDATE1

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

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

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

有谁知道这些是什么吗(谷歌不会带来太多的信息。)(目前)

无论如何,我不像麻烦的实例那样拥有TabletPenServiceHelperClass。

EN

回答 2

Stack Overflow用户

发布于 2018-10-17 05:57:19

SystemEvent.OnUserPreferencesChanged冻结通常可以通过仅仅锁定(Win+L)和解锁Windows屏幕来再现。

请尝试从CheckSystemEventsHandlersForFreeze()方法中调用这个答案 (在冻结之前甚至之后!)要找出最初在错误的线程(非UI,通常是线程池)上创建的pool控件,从而导致冻结。

票数 0
EN

Stack Overflow用户

发布于 2018-10-17 06:31:44

我终于在我的案子里发现了这个问题。我必须使用MS支持,并且使用一个转储文件,他们能够将我在一个工作线程上创建的窗口引脚到哪里。查看代码,我的猜测是,在调用它的控件有一个窗口句柄之前,它被调用时出现了一个InvokeRequired失败。

我现在总是在InvokeRequired主应用程序窗口上调用,但是有一个嵌套非常深的地方被遗漏了。

如果您的情况如这里所示,即在工作线程上创建的窗口,OnUserPreferencesChanged稍后会导致此冻结。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51667477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档