数据可快速填充

本文关键字:填充 数据 | 更新日期: 2023-09-27 18:02:39

大家好!

我有一个多线程应用程序,其目的通常是处理非常快速填充的消息队列。消息由一个线程添加到队列中,另一个线程处理它们。

在处理线程中,一些消息必须在网格中显示。网格的数据源是DataTable。处理线程使用DataTable(在每个消息处理上);NID, SID, BID -是1条消息的一部分):

                        Lockers[5].WaitOne();
                        Continue = true;
                        for (int i = 0; i <= mDataSource.Tables["Stations"].Rows.Count - 1; i++)
                        {
                            DataRow Current = mDataSource.Tables["Stations"].Rows[i];
                            if ((ushort)Current["SID"] == SID &&
                                (ushort)Current["NID"] == NID &&
                                (ushort)Current["BID"] == BID)
                            {
                                Continue = false;
                                break;
                            }
                        }
                        if (Continue &&)
                        {
                            SyncContext.Post(x =>
                            {
                                mDataSource.Tables["Stations"].BeginLoadData();
                                mDataSource.Tables["Stations"].Rows.Add(
                                    (fbn + 1) * 10 + 1 + dn,
                                    DeviceList[fbn].Main.Receivers[dn].Channel,
                                    DeviceList[fbn].Main.Receivers[dn].Pilot, SID, NID, BID,
                                    DeviceList[fbn].Receivers[dn].MCC, Latitude, Longitude);
                                mDataSource.Tables["Stations"].EndLoadData();
                            },                                    
                            null);                               
                        }
                        Lockers[5].ReleaseMutex();

locks[5] -互斥对象,mDataSource -数据集对象。SynContext——是一个主要应用程序形式的同步上下文。正如我上面所说的,消息队列的填充速度非常快,所以这段代码在运行时1秒内触发大约500次。消息队列中可能有重复,所以不能显示它们。问题是,在消息处理线程的几个第一次迭代,我得到mDataSource.Tables["Stations"].行。Count = 0,因此,我的Continue变量= true,我的表中有一个重复。在接下来的迭代中,我还在日志中看到表中添加了行,但Count可能仍然是2(但在日志中添加了17行)。为什么会这样呢?

我尝试更改锁(){}操作符上的互斥对象。这对我没有帮助。我尝试在BindingList上更改DataTable。这对我没有帮助。我可以通过创建全局变量private readonly int[]来降低表中的重复计数LastAddedStation = new int[3];并在if块(if (Continue){})中添加这样的表达式:LastAddedStation[0] != SID || LastAddedStation[1] != NID || LastAddedStation[2] != BID。这有助于我降低表中的重复次数,但是,在我看来,这是"气味"。有什么明确的方法可以帮助我吗?

我做错了什么?在高负载工作中使用数据表的最佳实践是什么?

注:对不起,我的英语不是母语。

数据可快速填充

主要在这里回答- SynchronizationContext。Send和SynchronizationContext.Post?.

Post方法在异步模式下工作- "drop off and continue"。所以在下一次迭代中,post方法中的代码似乎还没有完成。

我选择添加一个单独的计数器来计数添加的行,并使用DataTable进行检查。计数。