我是个菜鸟,最近要用到后台操作,以免界面无响应,但不知道为何在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);
            }
          }
        }
    }

解决方案 »

  1.   

    backgroundworker1很少使用。我一般都是自己开线程:Thread th=new Thread(new ThreadStart(Method));
    th.IsBackground=true;
    th.Start();
      

  2.   

    dataGridView1.DataSource=table;
    你的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的具体用法非常多,你仔细看看、、、
      

  3.   

    因为table已经是dataGridView1的数据源.
    如果在线程操作数据源,dataGridView1会增加行以响应数据的更新,但此时的操作又不在同一个线程中。
    最好在 backgroundworker1.RunWorkerAsync();之前设置
    dataGridView1.DataSource=null;
    工作完成后再设置数据源。
      

  4.   

    加上application.doevent() 可以讓介面不會慢死了private void backgroundworker1_DoWork(object sender, DoWorkEventArgs e)
      {
       
      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);
      }
      }
      

  5.   

    是的,你在dowork中更改了table,table又跟datagridview绑定,跟窗体有了消息传递,必然卡
     建议先不要把数据源绑定
    在backgroundWorker1_RunWorkerCompleted
    中dataGridView1.DataSource=table;