【问题标题】:Unsubscribing event from inside another event从另一个事件中取消订阅事件
【发布时间】:2021-04-03 15:42:44
【问题描述】:

我正在尝试取消订阅另一个事件中的一个事件,但我不知道我应该如何处理这个问题,或者是否有一个简单的模式。我已经查看了 Microsoft 的官方文档,但没有找到任何解决问题的方法。

        private void bTrainingD_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += new EventHandler(dispatcherTimer_Tick);
            timer.Start();
        }

        ...

        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            if (true)
            {
                //some code here
            }
            else
            {
                // unsubscribe or stop the Tick-Event here
            }

        }

感谢您的帮助。 :-)

【问题讨论】:

    标签: c# wpf events event-handling unsubscribe


    【解决方案1】:

    您需要在类字段中而不是在局部变量中保留对timer 的引用,以使其在另一个类方法中可访问:

    private System.Windows.Threading.DispatcherTimer timer;
    
    private void bTrainingD_Click(object sender, RoutedEventArgs e)
    {
        timer = new System.Windows.Threading.DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += dispatcherTimer_Tick;
        timer.Start();
    }
    
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        if (true)
        {
            //some code here
        }
        else
        {
            timer.Tick -= dispatcherTimer_Tick;
        }
    }
    

    【讨论】:

    • 我认为您可以使用 sender 变量获取引发_Tick 事件的DispatcherTimer。我认为这比使用 DispatcherTimer 保留成员变量更好
    • @JayV,发件人给出了相同的参考,是的。但是使用专用字段可以更简单地找到禁用计时器的位置。也可以在刻度处理程序之外禁用它。我更喜欢这里的可读性
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多