c# - C# 中的线程事件回调

标签 c# multithreading events

我有一个用于监视事件的 B 类(INotifyPropertyChanged 的​​实现)。它位于接收事件通知的 A 类内部。 B 类生成的事件通常非常频繁,所以我想:

  1. 在线程 ThA 上运行类 A 的代码(不与包含类 B 交互)

  2. 在线程 ThB 上运行类 B 的代码,当事件发生时,在通知包含该事件的类 A 之前(通过对 ThA 的调度程序进行调用?),它会检查 ThA 是否为这样,我会保留它,以便只有 ThA 在 A 内部运行,并且还避免来自 B 类的通知淹没 ThA(来自 B 类的信息将为 A 类创建“仅当 ThA 有时间时”的事件) )。

所以它可能看起来像这样 -

public class A
{
     private B b
     private Thread ThA

     public A
     {
         b= new B(ThA);
         b.PropertyChanged+=..
     }

     Event1 callback running on ThA
     Event2 callback running on ThA
     Callback for b (invoked in ThA)
}

public class B : INotifyPropertyChanged
{
       private Thread ThA
       private Thread ThB

       public B(ThA_)
       {
            ThA=ThA_;
       }

       private void EventInClassB_Updated(object sender, Args e)
       {
            if (ThA is not being used for anything)
            {
                DispatcherForThreadA.invoke( notifyPropertyChanged() ); //send the callback to class A
            }
       }

}

有谁知道是否有更聪明的方法来做到这一点,如果没有,我如何编码“ThA 没有被用于任何用途”?

谢谢! 克里斯

最佳答案

您可以使用 MonitorMutex控制对 ThA 的访问。只需调用 Monitor.TryEnter 即可获取锁定。如果 TryEnter 失败,则 ThA 正在使用中。确保在 ThA 完成后调用 Monitor.Exit

使用Mutex的代码是类似的。一般来说,Monitor 的性能会更好,但它不能跨应用域边界使用。

关于c# - C# 中的线程事件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919685/

相关文章:

c# - 在 Windows 10 edge 上运行自动化测试是否需要进行任何特殊设置

java - Netty-NioWorker池和工作线程池的关系

jquery定义自定义事件

jquery - 尝试根据当前 div 中应用的背景颜色来更改 div 的背景颜色。

c# - BlockingCollection 与异步任务

javascript - 如何将文本框值设置为隐藏字段

c++ - 如何在线程c++11中调用二类成员函数中的一类成员函数

c++ - 宽松原子操作的内存模型释放/获取模式交互

events - 尝试阻止默认时自定义 keydown 事件的类型错误

c# - StringReader 省略尾随换行符