C# 调用backgroundWorker1.DoWork事件方法-程序异常
我的winforms应用程序中有backgroundworker从数据库加载数据 注册方法:C# 调用backgroundWorker1.DoWork事件方法-程序异常,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,我的winforms应用程序中有backgroundworker从数据库加载数据 注册方法: backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; backgroundWorker1.Progr
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()来解决线程竞赛错误也是非常错误的。