datagridview,dataview的最新问题~~~~你遇到过吗?

时间:2020-12-17 20:11:29
这样的,我有两个datagridview分别绑定到两个dataview,这两个dataview所属的dataset是一样的,只是过滤条件不同而已~
后台起一条子线程(timer线程)更新dataset的数据,当一次插入10多条新数据时,程序就吊死了!
我追寻几天的程序吊死问题原来出来,郁闷~~

请问诸位,这个问题怎么解决?

最后一个关于线程的问题了,进来的人都要顶哦~~

13 个解决方案

#1


还没接触线程..up

#2


代码贴一下,看看

#3


学习

#4


代码其实没什么,还是贴一下吧
在这里绑定:
            DataView dv = new DataView(dt);
            dv.RowFilter = "test1<300";
            BindingSource bs = new BindingSource(dv, "");
            spDataGridView1.DataSource = bs;

            DataView dv2 = new DataView(dt);
            dv2.RowFilter = "test1>300";
            BindingSource bs2 = new BindingSource(dv2, "");
            spDataGridView2.DataSource = bs2;

在这里定时更新数据(用timer):
            lock (ds)
            {
                Random rand = new Random(DateTime.Now.Millisecond);
                int count = rand.Next(30);
                Console.WriteLine(count);
                for (int i = 0; i < count; i++)
                {
                    dt2.Rows.Add(
                        new object[] { rand.Next(1200), "12312", rand.Next(10),
                        rand.Next(30), rand.Next(300), rand.Next(300), 
                        rand.Next(300), rand.Next(300), rand.Next(300) });
                }
                foreach (DataRow o in dt2.Rows)
                {
                    ds.Tables[0].Rows.Add(o.ItemArray);
                    ds.Tables[0].AcceptChanges();
                   //Thread.Sleep(100);
                }
            }
就这样~

#5


处理数据的部分lock下
可能是多线程操作,导致资源互斥,产生了死锁


用多线程要考虑数据共享的部分加lock

#6


lock(aa)
{
   //dosomething...
}

#7


引用 5 楼 llsen 的回复:
处理数据的部分lock下 
可能是多线程操作,导致资源互斥,产生了死锁 


用多线程要考虑数据共享的部分加lock
up

#8


路过学习.

#9


up

#10


引用 5 楼 llsen 的回复:
处理数据的部分lock下 
可能是多线程操作,导致资源互斥,产生了死锁 


用多线程要考虑数据共享的部分加lock

应该就是这个问题,解决互斥问题应该就好,

#11


多线程死锁问题可能是一个方面,更大的可能性是改变数据源会引发界面绑定操作引起的吧

#12


线程还不会 - -#

#13


关于用lock的问题,像我上面该如何加上lock呢?
我在改变数据的那里加上了lock,但是绑定到datagridview怎么加lock呢?

请看我上面贴的代码~~~

#1


还没接触线程..up

#2


代码贴一下,看看

#3


学习

#4


代码其实没什么,还是贴一下吧
在这里绑定:
            DataView dv = new DataView(dt);
            dv.RowFilter = "test1<300";
            BindingSource bs = new BindingSource(dv, "");
            spDataGridView1.DataSource = bs;

            DataView dv2 = new DataView(dt);
            dv2.RowFilter = "test1>300";
            BindingSource bs2 = new BindingSource(dv2, "");
            spDataGridView2.DataSource = bs2;

在这里定时更新数据(用timer):
            lock (ds)
            {
                Random rand = new Random(DateTime.Now.Millisecond);
                int count = rand.Next(30);
                Console.WriteLine(count);
                for (int i = 0; i < count; i++)
                {
                    dt2.Rows.Add(
                        new object[] { rand.Next(1200), "12312", rand.Next(10),
                        rand.Next(30), rand.Next(300), rand.Next(300), 
                        rand.Next(300), rand.Next(300), rand.Next(300) });
                }
                foreach (DataRow o in dt2.Rows)
                {
                    ds.Tables[0].Rows.Add(o.ItemArray);
                    ds.Tables[0].AcceptChanges();
                   //Thread.Sleep(100);
                }
            }
就这样~

#5


处理数据的部分lock下
可能是多线程操作,导致资源互斥,产生了死锁


用多线程要考虑数据共享的部分加lock

#6


lock(aa)
{
   //dosomething...
}

#7


引用 5 楼 llsen 的回复:
处理数据的部分lock下 
可能是多线程操作,导致资源互斥,产生了死锁 


用多线程要考虑数据共享的部分加lock
up

#8


路过学习.

#9


up

#10


引用 5 楼 llsen 的回复:
处理数据的部分lock下 
可能是多线程操作,导致资源互斥,产生了死锁 


用多线程要考虑数据共享的部分加lock

应该就是这个问题,解决互斥问题应该就好,

#11


多线程死锁问题可能是一个方面,更大的可能性是改变数据源会引发界面绑定操作引起的吧

#12


线程还不会 - -#

#13


关于用lock的问题,像我上面该如何加上lock呢?
我在改变数据的那里加上了lock,但是绑定到datagridview怎么加lock呢?

请看我上面贴的代码~~~