C# 改进事件订阅

C# 改进事件订阅,c#,events,design-patterns,event-handling,C#,Events,Design Patterns,Event Handling,在我的应用程序中,我使用DataGridView来显示大量数据。大部分数据是来自单独系统的生产数据。我定期轮询单独的系统来更新数据,如果值发生了变化,我会更新DataGridView 我已经通过募集和消费活动建立了这一机制,但这是非常缓慢和痛苦的 从生产系统(PIHandler)检索数据的类具有以下方法: #region Event Handlers public event EventHandler<PIValueChangedEventArgs> ValueChanged; pu

在我的应用程序中,我使用DataGridView来显示大量数据。大部分数据是来自单独系统的生产数据。我定期轮询单独的系统来更新数据,如果值发生了变化,我会更新DataGridView

我已经通过募集和消费活动建立了这一机制,但这是非常缓慢和痛苦的

从生产系统(PIHandler)检索数据的类具有以下方法:

#region Event Handlers
public event EventHandler<PIValueChangedEventArgs> ValueChanged;
public void OnValueChanged(object sender, PIValueChangedEventArgs valueChangedEventDetails)
{
    ValueChanged?.Invoke(this, valueChangedEventDetails);
}
#endregion
...

//Extract from method that updates the values
//Update all points
for (int i = 0; i < CurrentValues.Count; i++)
{
    AFValue value = CurrentValues[i];
    PIPoint currentPoint = value.PIPoint;
    PreviousValues[currentPoint] = value;
    OnValueChanged(this, new PIValueChangedEventArgs(currentPoint, value));
}
我有一个简单的问题,这是缓慢的。我有大约240个监控点,至少有这么多订户。因此,当240个点都引发了一个“valueChanged”事件,240个订户中的每一个都必须检查自己是否是正确的消费者时,这需要花费太长的时间——大约两分钟。(我已经使用一个静态变量进行了测试,以查看订阅者处理_ValueChanged事件的次数,超过240000次)。我感到惊讶的是,即使有这么多的支票,它是如此缓慢,但它是什么

注意,我还确认了事件的循环占用了时间——我在更新值之前暂停了datagridview上的所有UI更新,因为我假设这就是原因

我真正想做的是,当我发起活动时,只针对特定的消费者,而不只是向所有订阅者广播活动。我找不到一个好的设计模式

我考虑不使用事件,而是让PI管理器有一个映射到订阅者的点字典,当一个点发生变化时,找到它的订阅者,并直接更新它们。但这是一个相当重要的重写

有什么建议吗


编辑:我发现了一个导致额外循环的bug。但问题仍然存在-是否有一种“好”的方式将事件定向到订阅服务器的子集?

因此在线程之间有O(n^2)个事件要封送?理论上是的,但我认为我仍在搜索其他内容-对事件处理程序的240000次调用超过(240)^2个点,所以我假设有另一个循环在某处引起问题。深入研究这个问题。
private void PIManager_ValueChanged(object sender, PIValueChangedEventArgs e)
{
    if (e.Point == PiPoint)
    {
        //update the value
        this.Value = e.Value;
    }
}