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();
}