相关疑难解决方法(0)

.NET 4.0和可怕的OnUserPreferenceChanged Hang

我一直受到可怕的OnUserPreferenceChanged Hang的困扰,Ivan Krivyakov在这里很好地提到了这里:

http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance

我刚回来时发布了一个问题,当时我最初遇到问题:

又一个C#死锁调试问题

我以为我已经通过移除一个由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重现冻结(而且我们现在已经很好地再现了这个......).

.net c# clr multithreading deadlock

11
推荐指数
1
解决办法
7312
查看次数

我可以使用反射取消订阅系统事件吗?

我需要创建一个 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)

c# winforms

2
推荐指数
1
解决办法
890
查看次数

标签 统计

c# ×2

.net ×1

clr ×1

deadlock ×1

multithreading ×1

winforms ×1