【问题标题】:Unsubscribing / Subscribing Events dangerous?退订/订阅事件危险吗?
【发布时间】:2013-06-26 16:30:54
【问题描述】:

最初这个问题把我带到这里: Disable firing TextChanged event

我想知道 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-events 在另一个这样的事件中吗?

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

【问题讨论】:

  • 这只是我,但我会使用标志(即:if(IsProcessing) return;)、锁或某种节流器(类似于反应式库中的节流器)。跨度>
  • 我个人会使用类似接受的答案来回答这个问题。我只在处理分配了处理程序的动态控件时删除处理程序。
  • 没关系。并且没有 textchanged 不能从失去焦点中调用......或者至少我不明白如何
  • @SimonBelanger 我也是,这就是为什么我想知道这是否会失败;)
  • @MarkHall 你会如何推理?取消订阅事件并没有那么昂贵,而且它也可以阅读。

标签: c# winforms events


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多