取消订阅/订阅事件很危险

本文关键字:危险 取消 事件 | 更新日期: 2023-09-27 18:20:10

最初这个问题把我带到了这里:禁用触发TextChanged事件

我想知道jtmach的答案是否"干净":

   private void mytextbox_LostFocus(object sender, RoutedEventArgs e)
    {
      this.mytextbox.TextChanged -= this.myTextBox_TextChanged;
      if(textbox.Text.ToString().Contains('.'))
      {
             textbox.Foreground = new SolidColorBrush(Colors.Gray);
             textbox.Background = new SolidColorBrush(Colors.White);
      }
      this.mytextbox.TextChanged += this.myTextBox_TextChanged;    
    }

可以取消订阅其他类似事件中的TextChanged-事件吗?

还是因为在LostFocus期间可以调用TextChanged事件(由用户或程序调用)而容易出错?

取消订阅/订阅事件很危险

如果这是在多线程上下文中,那么这将是一个问题。当您取消订阅时,TextChanged事件可能当前正在运行,从而防止您假设它正在运行,而此代码也在运行。

也就是说在这种情况下两个方法将始终在UI线程中运行,因此,虽然这段代码不会真正被"破坏"(你不能同时运行文本更改事件,因为UI线程一次只能运行两个事件中的一个),但它也没有任何作用,只能被删除(因为这个事件处理程序在运行时无法激发事件,因为它阻塞了UI线程)。