C#BackgroundWorker、DataSet和DataGridView多线程更新
请提前注意,这是我第一次使用多线程,也是我第一次尝试使用第二个线程填充/编辑C#BackgroundWorker、DataSet和DataGridView多线程更新,c#,datagridview,datagrid,dataset,backgroundworker,C#,Datagridview,Datagrid,Dataset,Backgroundworker,请提前注意,这是我第一次使用多线程,也是我第一次尝试使用第二个线程填充/编辑数据集,然后将该数据集显示到专用于DataGridView控件的Windows窗体中。我读过关于线程安全代码的各种文章,我相信我的理解是正确的 在调试期间,数据集被传递到BackgroundWorker,并使用e.Result从线程中拉出。然后它被分配回整个程序中使用的变量 当查看数据集对象的内存时,当它到达frmGridView时,它拥有加载到该对象中的所有数据,但控件从未更新 以下是我的代码片段。任何关于更好的代码组
数据集
,然后将该数据集
显示到专用于DataGridView
控件的Windows窗体中。我读过关于线程安全代码的各种文章,我相信我的理解是正确的
在调试期间,数据集
被传递到BackgroundWorker
,并使用e.Result
从线程中拉出。然后它被分配回整个程序中使用的变量
当查看数据集
对象的内存时,当它到达frmGridView
时,它拥有加载到该对象中的所有数据,但控件从未更新
以下是我的代码片段。任何关于更好的代码组织/结构的建议、建议和想法都会非常有用。同样,这是我第一次使用BackgroundWorker
谢谢
方法片段:
private DataSet ProcessListXml(DataSet _dsData, BackgroundWorker _bwThread)
..
_dsData.Tables["MainList"].BeginLoadData();
..
DataRow row = _dsData.Tables["MainList"].NewRow();
..
_dsData.Tables["MainList"].Rows.Add(row);
..
_bwThread.ReportProgress((currLine / totalLines) * 100);
} //reader.Read()
..
_dsData.Tables["MainList"].EndLoadData();
_dsData.Tables["MainList"].AcceptChanges();
return _dsData;
public partial class frmDataView : Form
{
DataSet dsGameList;
public frmDataView(DataSet _in)
{
dsGameList = _in;
InitializeComponent();
dataGridView.DataSource = dsGameList.Tables["GameList"];
}
public void RefreshView()
{
dataGridView.Refresh();
}
private void bwThread_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = ProcessMameListXml(dsData, worker);
}
private void bwThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
dvProgressBar.UpdateProgressBar(e.ProgressPercentage);
}
private void bwThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dsData = (DataSet)e.Result;
dvProgressBar.Close();
UpdateUIElements();
dvWindow.RefreshView();
}
DataGridView窗口窗体:
private DataSet ProcessListXml(DataSet _dsData, BackgroundWorker _bwThread)
..
_dsData.Tables["MainList"].BeginLoadData();
..
DataRow row = _dsData.Tables["MainList"].NewRow();
..
_dsData.Tables["MainList"].Rows.Add(row);
..
_bwThread.ReportProgress((currLine / totalLines) * 100);
} //reader.Read()
..
_dsData.Tables["MainList"].EndLoadData();
_dsData.Tables["MainList"].AcceptChanges();
return _dsData;
public partial class frmDataView : Form
{
DataSet dsGameList;
public frmDataView(DataSet _in)
{
dsGameList = _in;
InitializeComponent();
dataGridView.DataSource = dsGameList.Tables["GameList"];
}
public void RefreshView()
{
dataGridView.Refresh();
}
private void bwThread_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = ProcessMameListXml(dsData, worker);
}
private void bwThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
dvProgressBar.UpdateProgressBar(e.ProgressPercentage);
}
private void bwThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dsData = (DataSet)e.Result;
dvProgressBar.Close();
UpdateUIElements();
dvWindow.RefreshView();
}
BackgroundWorker代码片段:
private DataSet ProcessListXml(DataSet _dsData, BackgroundWorker _bwThread)
..
_dsData.Tables["MainList"].BeginLoadData();
..
DataRow row = _dsData.Tables["MainList"].NewRow();
..
_dsData.Tables["MainList"].Rows.Add(row);
..
_bwThread.ReportProgress((currLine / totalLines) * 100);
} //reader.Read()
..
_dsData.Tables["MainList"].EndLoadData();
_dsData.Tables["MainList"].AcceptChanges();
return _dsData;
public partial class frmDataView : Form
{
DataSet dsGameList;
public frmDataView(DataSet _in)
{
dsGameList = _in;
InitializeComponent();
dataGridView.DataSource = dsGameList.Tables["GameList"];
}
public void RefreshView()
{
dataGridView.Refresh();
}
private void bwThread_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = ProcessMameListXml(dsData, worker);
}
private void bwThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
dvProgressBar.UpdateProgressBar(e.ProgressPercentage);
}
private void bwThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dsData = (DataSet)e.Result;
dvProgressBar.Close();
UpdateUIElements();
dvWindow.RefreshView();
}