C# 取消订阅/订阅活动是否危险?

C# 取消订阅/订阅活动是否危险?,c#,winforms,events,C#,Winforms,Events,最初,这个问题把我带到这里: 我想知道jtmach的答案是否“干净”: 在另一个类似这样的活动中取消订阅TextChanged-事件可以吗 或者它容易出错,因为在LostFocus期间,TextChanged事件可能会被调用(由用户或程序调用)?如果这是在多线程上下文中,那么这将是一个问题。当您取消订阅时,TextChanged事件可能当前正在运行,从而阻止您假设它正在运行,而此代码也在运行 这就是说,在这种情况下,这两个方法都将始终在UI线程中运行,因此虽然这段代码不会真正被“破坏”(您不能

最初,这个问题把我带到这里:

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

在另一个类似这样的活动中取消订阅
TextChanged
-事件可以吗


或者它容易出错,因为在LostFocus期间,TextChanged事件可能会被调用(由用户或程序调用)?

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


这就是说,在这种情况下,这两个方法都将始终在UI线程中运行,因此虽然这段代码不会真正被“破坏”(您不能同时运行text changed事件,因为UI线程一次只能运行两个事件中的一个),但它也不起作用,只能被删除(因为此事件处理程序正在运行时无法触发事件,因为它正在阻止UI线程)。

这只是我的问题,但我会使用标志(即:
if(IsProcessing)return;
)、锁或某种节流器(类似于反应库中的节流器)。我个人会使用类似于该问题的公认答案的内容。我只在处理分配给处理程序的动态控件时删除处理程序。这没关系。而且不会从失去焦点处调用文本更改…或者至少我看不到how@SimonBelanger我也是,所以我想知道这是否会失败;)@MarkHall你怎么解释?取消订阅活动没有那么昂贵,而且可读性也很好。
   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;    
    }