如何取消订阅带有参数的事件?

how to unsubscribe an event with parameter(s)?

在我的WPF程序中,我需要为一个飞行模拟软件设置飞机故障。例如,如果我单击 MainWindow 上的 "Fire Engine 1" 按钮,

    private DispatcherTimer DT;

    private void button_Engine_1_On_Fire(object sender, RoutedEventArgs e)
    {
        SettingFailureCondition("Fire engine 1");
    }

然后会弹出一个 window 实例 "ftc" 供用户设置触发失败的条件

    private void SettingFailureCondition(string failure_name)
    {
      FailureTriggerCondition ftc = new FailureTriggerCondition();
      ...
      if (ftc.ShowDialog() == true)
      {
         if(altitude>input)//if the altitude in the software higher than user's input
         {
            DT.Tick += new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));
            DT.Interval = new TimeSpan(0, 0, 0, 1);
            DT.Start();
            DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?
         }
      }
    }

对于上面的代码,我需要每秒检测一次高度是否满足要求。 但是一旦遇到就执行MoveFailureByFlag,停止检测怎么办?

if(altitude>input)//once this is met, execute function MoveFailureByFlag then stop detecting it  

我正在考虑取消订阅该活动,但在这种情况下找不到办法。 以下失败,但我不知道为什么。

DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?

感谢您的帮助。

让我先回答你的一般问题:

DT.Tick += new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));
...
DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?

它们不对应,因为它们是两个不同的事件处理程序(注意 new 关键字)。

但是,您可以将事件处理程序保存在变量中并使用它来取消订阅:

EventHandler myHandler = new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));

DT.Tick += myHandler;
...
DT.Tick -= myHandler;

但是,在您的特定代码示例中,您将在事件有时间发生之前删除事件处理程序,因此根本不会发生任何事件

如果您想在 事件第一次发生后删除处理程序 ,您可以使用 "self-removing" 事件处理程序:

EventHandler myHandler;

myHandler = new EventHandler((sender, e) =>
{
    MoveFailureByFlag(failure_name, flag);
    DT.Tick -= myHandler;
});
DT.Tick += myHandler;
DT.Interval = ...;
DT.Start();