Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms.net 4.7应用程序在OnUserChanged SystemEvent中冻结_C#_.net_Multithreading_Winforms - Fatal编程技术网

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

C# Winforms.net 4.7应用程序在OnUserChanged SystemEvent中冻结,c#,.net,multithreading,winforms,C#,.net,Multithreading,Winforms,我有一个Winforms应用程序,它部署在许多客户端站点上,运行起来没有问题 我有一个站点(实际上第二个站点刚刚报告了它),在那里应用程序将无缘无故地冻结 我们通过一个小转储获得的事件单堆栈跟踪显示了OnUserChanged事件中的冻结 ViewManager.RunApplication是我调用Application.Run(m_mainFrame.Form)的地方其中m_mainForm是我的主要申请表 我已经找到了很多关于这方面的帖子和各种建议,例如自定义启动屏幕-我删除了它-没有区别

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

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

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

提前感谢您提供的任何信息

[UPDATE1]

看起来Spyxx和visualstudio(调试)中的线程id根本不匹配。我在本地机器上运行了我的应用程序(这样我就可以看到我在spyxx中有什么窗口),我可以在这两个地方识别我的主UI线程,它们的ID完全不同

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

我也不知道这是什么。当我进入属性(通过spy++)时,我可以看到其中一个窗口的标题是
.NET BroadcastEventWindow.4.0.0.3f2ddb3.0
,另一个窗口只显示
默认输入法

有人知道这些是什么吗(谷歌搜索并没有带来太多…)


无论如何,我没有像麻烦的实例那样拥有TabletPenseServiceHelper类。

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


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

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

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


如果您的情况与此处相同,即在工作线程上创建的窗口,OnUserPreferencesChanged稍后会导致此冻结。

您是否搜索过
Wisptis.exe
(\System32,通常)?。Windows ink服务的一部分。可以在启动时执行,也可以与一些众所周知的程序(例如Adobe Reader)结合使用。使用
tabletpenseserviceheloperclass
可以作为Windows OOBE的一部分(
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE
),请参阅:。请删除.exe并重试。