DataTable快速人口

时间:2015-07-14 10:12:51

标签: c# multithreading datatable population

美好的一天!

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

在处理线程中,某些消息必须以网格显示。 Grid的DataSource是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();

Lockers [5] - Mutex对象,mDataSource - DataSet对象。 SynContext - 是主应用程序表单的同步上下文。正如我上面说的那样,消息队列的填充速度非常快,因此这段代码在运行时间内在1秒内激发大约500次。并且在消息队列中可能会重复,所以我不能显示它们。问题,在消息处理线程的几个第一次迭代我得到mDataSource.Tables [“Stations”] .Rows.Count = 0,所以因为我的Continue变量= true,我在我的表中有重复。在下一次迭代中,我还在日志中看到行已添加到表中,但Count可能仍为2(但在日志中添加了17行)。为什么会这样?

我尝试在lock(){}运算符上更改Mutex对象。这对我没有帮助。我尝试在BindingList上更改DataTable。这对我没有帮助。我可以通过创建全局变量private readonly int [] LastAddedStation = new int [3]来降低表中的重复次数。并在if块中添加这样的表达式(if(Continue){}):LastAddedStation [0]!= SID || LastAddedStation [1]!= NID || LastAddedStation [2]!= BID。帮助我降低表中的重复次数,但是,在我看来,它是“闻起来”。有没有明确的方法来帮助我的情况?

我做错了什么?使用DataTables进行高负载工作的最佳实践是什么?

P.S。对不起我的英语,我不是母语。

1 个答案:

答案 0 :(得分:0)

主要是在这里回答 - What is the difference between SynchronizationContext.Send and SynchronizationContext.Post?

Post方法在异步模式下工作 - &#34;下拉并继续&#34;。因此,似乎在下一次迭代中,post方法中的代码还没有完成。

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