请提前注意这是第一次使用多个线程并且我第一次尝试使用第二个线程来填充/编辑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();
}