【问题标题】:Event Callbacks with Threading in C#在 C# 中使用线程的事件回调
【发布时间】:2012-10-16 16:52:54
【问题描述】:

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

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

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

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

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 没有被用于任何事情”?

谢谢! 克里斯

【问题讨论】:

  • 顺便说一句,在构造函数中替换事件在多线程环境中是 BAD 的事情:您将非构造对象暴露给外部世界,外部世界可以同时使用它!

标签: c# multithreading events


【解决方案1】:

您可以使用MonitorMutex 来控制对ThA 的访问。只需致电Monitor.TryEnter 即可获得锁。如果 TryEnter 失败,则 ThA 正在使用中。 ThA 完成后请务必致电Monitor.Exit

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多