C#BackgroundWorker,DataSet和DataGridView多线程更新

时间:2017-07-20 13:02:08

标签: c# datagridview datagrid dataset backgroundworker

请提前注意这是第一次使用多个线程并且我第一次尝试使用第二个线程来填充/编辑DataSet然后将DataSet显示到Windows窗体中致力于DataGridView控制。我已经阅读了有关线程安全代码的各种文章,我相信我会正确地进行它。

在调试过程中,DataSet会传递到BackgroundWorker并通过e.Result退出线程。然后将其分配回整个程序中使用的变量。

当查看DataSet对象的内存时,它具有在到达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;

DataGridView Windows窗体:

public partial class frmDataView : Form
{

    DataSet dsGameList;

    public frmDataView(DataSet _in)
    {
        dsGameList = _in;
        InitializeComponent();
        dataGridView.DataSource = dsGameList.Tables["GameList"];
    }

    public void RefreshView()
    {
        dataGridView.Refresh();
    }

BackgroundWorker片段:

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

0 个答案:

没有答案