如何使用参数取消订阅活动?

时间:2018-01-04 09:23:28

标签: c# wpf events dispatchertimer

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

    private DispatcherTimer DT;

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

然后弹出窗口实例" 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?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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;

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

如果您想在第一次发生事件后删除处理程序,则可以使用“自动删除”事件处理程序:

EventHandler myHandler;

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