我一直受到可怕的OnUserPreferenceChanged Hang的困扰,Ivan Krivyakov在这里很好地提到了这里:
http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance
我刚回来时发布了一个问题,当时我最初遇到问题:
我以为我已经通过移除一个由UI线程构建的Control来解决它,但过了一会儿它再次出现(可能永远不会离开......).
我们一直在使用.NET 3.5,据我所知使用的是CLR 2.0.最近,applciation已升级为使用.NET 4.0 Client Profile/CLR 4.0.此外,我们已从Infragistics WinForms 10.1升级到10.3.唯一的另一个区别是以前的版本是混淆的......有没有人遇到过混淆和挂起的问题?
我已经有另外一次尝试摆脱任何应用程序挂起一次又一次,但不同寻常的是,我无法在最新版本中重现挂起(使用.NET 4.0).使用Ivan Krivyakov的方便的Freezer应用程序(参见他的文章),可以根据请求触发WM_SETTINGCHANGE消息,在之前的版本(使用.NET 3.5)中重现这种情况很简单.
可能是我有点希望这个问题已经自动消失了,但是有人知道CLR从2.0到4.0是否有任何变化会导致这个问题?
-------------------------------------------------- - -解 - - - - - - - - - - - - - - - - - - - - - - - ----
因此,在测试应用程序的变体后,例如CLR 2.0 + Infragistics 2010.1,CLR 2.0 + Infragistics 2010.3和CLR 4.0 + Infragistics 2010.1,我们相信我们已经确定问题是WinForms 2010.1中的Infragistics组件的问题(没有热修复) ).我们仍然没有使用CLR 2.0或CLR 4.0与Infragistics 2010.3重现冻结(而且我们现在已经很好地再现了这个......).
我需要创建一个 RichTextBox 子类,除了它不订阅 UserPreferenceChanged 之外,它在所有方面的工作方式都相同。此事件导致我的应用程序挂起。我必须使用 RichTextBox,并且无法将其交换为 MultiLine=True 的 TextBox 或其他类似的内容。
这是System.Windows.Forms.RichTextBox 订阅的地方;
protected override void OnHandleCreated(EventArgs e)
{
...
SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(this.UserPreferenceChangedHandler);
}
Run Code Online (Sandbox Code Playgroud)
这是处理程序的签名;
private void UserPreferenceChangedHandler(object o, UserPreferenceChangedEventArgs e)
Run Code Online (Sandbox Code Playgroud)
该处理程序不是虚拟的,因此我无法覆盖它。该处理程序是私有的,因此我无法执行简单的-=来取消订阅。我已经研究过使用反射来删除处理程序,但我无法让它工作 - 这就是我到目前为止所拥有的;
public partial class MyRichTextBox : RichTextBox
{
...
private void UnsubscribeUserPreferenceChanged()
{
FieldInfo fieldInfo = typeof(SystemEvents).GetField("OnUserPreferenceChangedEvent", BindingFlags.NonPublic | BindingFlags.Static);
// fieldInfo.ToString() = "System.Object.OnUserPreferenceChangedEvent"
object eventObj = fieldInfo.GetValue(this);
// eventInfo.ToString() = "System.Object"
PropertyInfo propInfo = typeof(RichTextBox).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
// propInfo.ToString() = "System.ComponentModel.EventHandlerList Events"
EventHandlerList …Run Code Online (Sandbox Code Playgroud)