C# 如何使用来自多线程事件的快速数据更新ObservableCollection?

C# 如何使用来自多线程事件的快速数据更新ObservableCollection?,c#,multithreading,event-driven,C#,Multithreading,Event Driven,我正在为Aar制作一个绑定库。这个Aar通过RXJava在一个新线程上发送数据列表 这些数据(用rfid设备扫描的标签)通过事件发送到我的程序,该程序使用 public delegate void InventoryStreamTagsHandler(IList<string> epcS); /// <summary> observable à s'abonner </summary> public interface IInventoryCallBack

我正在为Aar制作一个绑定库。这个Aar通过RXJava在一个新线程上发送数据列表

这些数据(用rfid设备扫描的标签)通过事件发送到我的程序,该程序使用

public delegate void InventoryStreamTagsHandler(IList<string> epcS);

/// <summary> observable à s'abonner </summary>
public interface IInventoryCallBack
{
    /// <summary> réception d un stream </summary>
    event InventoryStreamTagsHandler StreamResult;
}
在收到的每个数据上,我搜索一个已知的Epc,如果它存在,则调用IncrementeCountAndDate,然后创建一个新的StreamResult,并将其添加到ObservableCollection中

但是数据越来越快,而且是多线程的,我没有时间处理它们
这是一个xamarin表单应用程序

将数据添加到另一个线程处理的队列中


如果瓶颈仅在UI上,您可以向IncrementeCountAndDate方法添加代码,以便仅在自上次更新以来的时间大于(例如)250毫秒时调用OnPropertyChanged。

您在事件上获得了一个
列表
字符串
?我现在实际上正在获得一个列表,我正在使用一个队列OnGuiUpdate,其中包含私有void OnStreamResult(IList epcS){foreach(epcS中的var epc){{{u epcS.Enqueue(epc);}}},然后在一个调用OnGuiUpdate(带循环的函数)的线程中,该线程将可观察到的集合出列并更新。我想知道是否有一种更漂亮的方法可以满足您的需求,正如@manulateigne所说的,线程安全的
队列
,其中一端(在您的事件中,您可以向其添加项目),然后您可以运行一个单独的线程,不断从队列中弹出项目,并将它们分散到
任务中。
private void OnStreamResult(IList<string> epcS)
ObservableCollection<StreamResult> StreamResultS 
public class StreamResult : MtcTools.DispatchNotifier
{
    public string Epc { get; }

    public DateTime LastUpdate { get; private set; } = DateTime.Now;

    public int Count { get; private set; } = 1; 

    public StreamResult(string epc)
    {
        Epc = epc;
    }

    public void IncrementeCountAndDate()
    {
        Count++;
        OnPropertyChanged("Count");

        LastUpdate = DateTime.Now;
        OnPropertyChanged("LastUpdate");
    }
}