-3

我有大量数据需要通过 C# 计算我在 DB 上有 10000 名患者,每个患者在 DB 上的记录平均有 30 次访问我需要检查他的访问组合,我通过 LINQ 完成了C# 中的SQL 组合并将其与其他患者进行比较,如果我发现其他 4 个患者具有相同的组合,我会认为它是安全的

我将此用于循环代码,但需要时间,我需要提高性能

Parallel.For(0, 10000, (j,loopState) =>
        {
            int id1 = getid(names[j].ToString(), 101);
            Parallel.For(0, 10000, (t,loopState1) =>
                {
                    generate_firstACV5A(id1, nvisit(id1), names[j].ToString());
                    int id2 = getid(names[t].ToString(), 10000);
                    if (id1 == id2) { }
                    else
                    {
                        generate_firstACV5B(id2, nvisit(id2), names[t].ToString());
                    }

                    if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true)
                    {
                        if (count == 0)
                     {
                         safecount++;
                         if (safecount == 4) {
                             ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString());
                             it.SubItems.Add(names[j].ToString());
                             listView3.Items.Add(it); loopState1.Break();
                         }


                       }
                    }
                });

当我将列表比较为真时出现一些运行错误

我感谢您的帮助

4

1 回答 1

2

如果您的代码至少有数百个ListViewItems生成,那么问题之一是您ListViewItems在代码执行期间添加了触发ListView重绘的代码(与您拥有的所有其他计算相比,这很慢)。把你ListViewItems放在第List一个,当你完成时,你将它们添加为数组,如下所示:

List<ListViewItems> list = new List<ListViewItems>();
Object myLock = new Object();
Parallel.For(0, 10000, (j,loopState) =>
        {
            int id1 = getid(names[j].ToString(), 101);
            Parallel.For(0, 10000, (t,loopState1) =>
                {
                    generate_firstACV5A(id1, nvisit(id1), names[j].ToString());
                    int id2 = getid(names[t].ToString(), 10000);
                    if (id1 == id2) { }
                    else
                    {
                        generate_firstACV5B(id2, nvisit(id2), names[t].ToString());
                    }

                    if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true)
                    {
                        if (count == 0)
                     {
                         safecount++;
                         if (safecount == 4) {
                             ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString());
                             it.SubItems.Add(names[j].ToString());

                             lock (myLock )
                             {
                                 list.Add(it); 
                             }

                             loopState1.Break();
                         }


                       }
                    }
                });
listView3.Items.AddRange(list.ToArray());

即使在添加期间锁定对列表的访问也会比用大约 1000 个项目重绘 listView 快得多。当我测试时,这种方法快了近 10 倍。

于 2012-11-29T01:33:33.900 回答