我是个菜鸟,最近要用到后台操作,以免界面无响应,但不知道为何在backgroundwork里插入一些数据行总是会导致程序响应慢,甚至死了。 我写出简单的源码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable table = new DataTable(); private void Form1_Load(object sender, EventArgs e)
{
table.Columns.Add("a", Type.GetType("System.String"));
table.Columns.Add("b", Type.GetType("System.String"));
table.Columns.Add("c", Type.GetType("System.String"));
dataGridView1.DataSource=table;
} private void button1_Click(object sender, EventArgs e)
{
/*在这里写就没什么问题,或者先dataGridView1.DataSource=null,等backgroundworker_RunWorkerCompleted里再dataGridView1.DataSource=table,这样也没问题
for(int i=0;i<300;i++)
{
DataRow row = table.NewRow();
row["uin"] = i.ToString();
row["name"]="124";
table.Rows.Add(row);
}
*/
//在backgroundwork1里做这些就会让程序卡住
backgroundworker1.RunWorkerAsync();
} private void backgroundworker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int i=0;i<300;i++)
{
DataRow row = table.NewRow();
row["a"] = i.ToString();
row["b"]="a"+i.ToString();
table.Rows.Add(row);
}
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable table = new DataTable(); private void Form1_Load(object sender, EventArgs e)
{
table.Columns.Add("a", Type.GetType("System.String"));
table.Columns.Add("b", Type.GetType("System.String"));
table.Columns.Add("c", Type.GetType("System.String"));
dataGridView1.DataSource=table;
} private void button1_Click(object sender, EventArgs e)
{
/*在这里写就没什么问题,或者先dataGridView1.DataSource=null,等backgroundworker_RunWorkerCompleted里再dataGridView1.DataSource=table,这样也没问题
for(int i=0;i<300;i++)
{
DataRow row = table.NewRow();
row["uin"] = i.ToString();
row["name"]="124";
table.Rows.Add(row);
}
*/
//在backgroundwork1里做这些就会让程序卡住
backgroundworker1.RunWorkerAsync();
} private void backgroundworker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int i=0;i<300;i++)
{
DataRow row = table.NewRow();
row["a"] = i.ToString();
row["b"]="a"+i.ToString();
table.Rows.Add(row);
}
}
}
}
th.IsBackground=true;
th.Start();
你的table被另外一个线程资源占用着
试一试:DataTable t=dataGridView1.DataSource as DataTable;
backgroundworker1.RunWorkerAsync(t);
private void backgroundworker1_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dt= e.Argument as DataTable
for(int i=0;i<300;i++)
{
DataRow row = table.NewRow();
row["a"] = i.ToString();
row["b"]="a"+i.ToString();
dt.Rows.Add(row);
}
具体的情况我没你的程序不好说什么,backgroundworker dowork方法有时候是无法调试进去,你试试我写的代码,网上对backgroundworker的具体用法非常多,你仔细看看、、、
如果在线程操作数据源,dataGridView1会增加行以响应数据的更新,但此时的操作又不在同一个线程中。
最好在 backgroundworker1.RunWorkerAsync();之前设置
dataGridView1.DataSource=null;
工作完成后再设置数据源。
{
for(int i=0;i<300;i++)
{
application.doevent()
DataRow row = table.NewRow();
row["a"] = i.ToString();
row["b"]="a"+i.ToString();
table.Rows.Add(row);
}
}
建议先不要把数据源绑定
在backgroundWorker1_RunWorkerCompleted
中dataGridView1.DataSource=table;