C# 调用backgroundWorker1.DoWork事件方法-程序异常

C# 调用backgroundWorker1.DoWork事件方法-程序异常,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,我的winforms应用程序中有backgroundworker从数据库加载数据 注册方法: backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; backgroundWorker1.Progr

我的winforms应用程序中有backgroundworker从数据库加载数据

注册方法:

backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
方法定义:

  private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
   {
       if (!backgroundWorker1.CancellationPending)
       {
           Ctransakcja obj = (Ctransakcja)e.UserState;
           string[] row = new string[] { obj.id.ToString(), obj.tytul, obj.kwota, obj.nrkonta,obj.bank };
           dataGridView2.Rows.Add(row); 
       }
   }

   private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   {

       button1.Enabled = true;

   }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
   {
       Ctransakcja obj = (Ctransakcja)e.Argument;
       LoadData(obj);
   }

    //funkcja ladujaca dane z bazy
   public void LoadData(Ctransakcja obj)
   {
       string CmdString;
       SqlCommand cmd;
       SqlDataReader reader;

      try
     {
           using (kd.con)
           {
               if (kd.con.State == ConnectionState.Closed)
                   kd.con.Open();
               CmdString = "SELECT * from TRANSAKCJE";
               cmd = new SqlCommand(CmdString, kd.con);
               reader = cmd.ExecuteReader();
               int i = 0;
               while (reader.Read())
               {
                   obj.id = int.Parse(reader[0].ToString());
                   obj.tytul = reader[1].ToString();
                   obj.kwota = reader[2].ToString();
                   obj.nrkonta = reader[3].ToString();
                   obj.bank = reader[4].ToString();
                   //dodanie danych itd
                   backgroundWorker1.ReportProgress(i, obj);
                   i++;
                   Thread.Sleep(10);
               }

           }
      }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message);
       }
   }
和按钮单击事件方法

private void button1_Click(object sender, EventArgs e)
{
           dataGridView2.DataSource = null;
           dataGridView2.Refresh();

           Ctransakcja obj = new Ctransakcja(0, "", "", "", "");

           if (!backgroundWorker1.IsBusy)
           {

               backgroundWorker1.RunWorkerAsync(obj);

               button1.Enabled = false;

               button1.Text = "Loading...";
           }
}
这是可行的,但在加载数据后,我遇到了异常:ConnectionString属性尚未初始化

在调试器模式下,我注意到LoadData方法再次调用!!然后我得到一个例外


谢谢

变量
kd
在哪里初始化?@DanielMann kd在Form1中声明并初始化Form1\u加载函数。Kd对象存储方法到数据库连接。几个错误。当您第二次单击按钮时,它肯定会崩溃,因为您已释放了连接对象。使用Thread.Sleep()来解决线程竞赛错误也是非常错误的。