gpt4 book ai didi

c# - 如何从应用程序中删除事件处理程序?

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:42 27 4
gpt4 key购买 nike

我被添加到应用程序的处理程序:

Application.ThreadException += (sender, a) => UnhandledExceptionsHelper.ApplicationOnThreadException(a, null);

在此之后我想添加另一个处理程序

Application.ThreadException += (sender, a) => UnhandledExceptionsHelper.ApplicationOnThreadException(a, param);

我怎样才能删除以前的处理程序?

当我从 Control 中删除处理程序时,我只使用:

    public void RemoveOnThreadException(SimpleButton b)
{
FieldInfo f1 = typeof(Control).GetField("EventClick",
BindingFlags.Static | BindingFlags.NonPublic);
object obj = f1.GetValue(b);
PropertyInfo pi = b.GetType().GetProperty("Events",
BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
list.RemoveHandler(obj, list[obj]);
}

如何对 Application 和 AppDomain 做同样的事情?

@Andrey 这是我对 Button.Click 的尝试:

public TestForm()
{
InitializeComponent();
simpleButton1.Click += (sender, a) => simpleButton1_Click(sender,a);
simpleButton1.Click -= simpleButton1_Click;
simpleButton1.Click += (sender, a) => simpleButton1_Click(sender, a);
}

private void simpleButton1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hi");
}

当我点击按钮时,我收到了两条消息。

最佳答案

删除处理程序的最佳方法是使用相同的处理程序取消订阅:

ThreadExceptionEventHandler handler = (sender, a) => UnhandledExceptionsHelper.ApplicationOnThreadException(a, null);
Application.ThreadException += handler;
//Later...
Application.ThreadException -= handler;

由于 C# 中的 event 本身只是 add/remove 方法的语法糖,因此没有通用的替代方法来取消订阅事件没有对处理程序的引用。特别是对于 Application.ThreadException,它变得更加奇怪。我们来看源码:

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Application.cs,8243b844777a16c3,references

public static event ThreadExceptionEventHandler ThreadException {
add {
Debug.WriteLineIf(IntSecurity.SecurityDemand.TraceVerbose, "AffectThreadBehavior Demanded");
IntSecurity.AffectThreadBehavior.Demand();

ThreadContext current = ThreadContext.FromCurrent();
lock(current) {
current.threadExceptionHandler = value;
}
}
remove {
ThreadContext current = ThreadContext.FromCurrent();
lock(current) {
current.threadExceptionHandler -= value;
}
}
}

查看这一行:current.threadExceptionHandler = value;

好像只能有一个handler,订阅覆盖了。它没有记录在案(MSDN 对这种行为只字不提),但显然这是一个已知问题:

关于c# - 如何从应用程序中删除事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42364358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com