后台起一条子线程(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);
}
}
就这样~
在这里绑定:
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
可能是多线程操作,导致资源互斥,产生了死锁
用多线程要考虑数据共享的部分加lock
#6
lock(aa)
{
//dosomething...
}
#7
up
#8
路过学习.
#9
up
#10
应该就是这个问题,解决互斥问题应该就好,
#11
多线程死锁问题可能是一个方面,更大的可能性是改变数据源会引发界面绑定操作引起的吧
#12
线程还不会 - -#
#13
关于用lock的问题,像我上面该如何加上lock呢?
我在改变数据的那里加上了lock,但是绑定到datagridview怎么加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);
}
}
就这样~
在这里绑定:
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
可能是多线程操作,导致资源互斥,产生了死锁
用多线程要考虑数据共享的部分加lock
#6
lock(aa)
{
//dosomething...
}
#7
up
#8
路过学习.
#9
up
#10
应该就是这个问题,解决互斥问题应该就好,
#11
多线程死锁问题可能是一个方面,更大的可能性是改变数据源会引发界面绑定操作引起的吧
#12
线程还不会 - -#
#13
关于用lock的问题,像我上面该如何加上lock呢?
我在改变数据的那里加上了lock,但是绑定到datagridview怎么加lock呢?
请看我上面贴的代码~~~
我在改变数据的那里加上了lock,但是绑定到datagridview怎么加lock呢?
请看我上面贴的代码~~~