C#多线程,关于BackgroundWorker的问题,求高手解决
class InputFromExcelSheet
{
/// <summary>
/// 根据Excel获取单张sheet的数据到datatable;
/// </summary>
/// <param name=""></param>
/// <returns></returns>
public DataTable ExcelFromSheet(int i,string filename)
{
DataTable dt = new DataTable();
Workbook xls = new Workbook(filename);//第三方插件 aspose.cells;
Worksheet sheet = xls.Worksheets[i];
int firstRow = 1, firstColumn = 0, totalRows = 0, totalColumns = 0;
totalRows = sheet.Cells.Rows.Count-1;
totalColumns = sheet.Cells.MaxColumn + 1;
if (totalRows==0)
{
string str = string.Format("所选Excel文件的第{0}张Sheet为空表单,请填写数据
后再导入!!!", i);
MessageBox.Show(str);
return null;
}
else
{
dt = sheet.Cells.ExportDataTableAsString(firstRow, firstColumn, totalRows,
totalColumns);//要以字符串的格式导入到datatable中去;否则按第一行的格式导入
return dt;
}
}
}
class ExcelHelper
{
public DataSet ds_Excel;//Excel的12张sheet的数据导入到内存dataset
public InputFromExcelSheet ipfe;//定义一个对象用来获取不同sheet中的数据到ds_excel数
据集;
OpenFileDialog ofd = new OpenFileDialog();
/// <summary>
/// 获取Excel中12张sheet的内容到ds_excel中;
/// </summary>
/// <param name=""></param>
/// <returns>是否获取数据成功;</returns>
///
public bool GetExcelData()
{
ofd.InitialDirectory = Application.ExecutablePath;
ofd.Filter = "Excel2003格式(*.xls)|*.xls|Excel2007格式(*.xlsx)|*.xlsx";
ofd.FilterIndex = 1;
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
Workbook xls = new Workbook(ofd.FileName);//第三方插件
if (xls.Worksheets.Count == 12)
{
using (BackgroundWorker worker = new BackgroundWorker())
{
ProgressLoading state = new ProgressLoading();//ProgressLoading 是
进度条
state.Show();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
//添加事件
worker.DoWork += new DoWorkEventHandler(worker_DoWork_DaoRu);
worker.ProgressChanged += new ProgressChangedEventHandler
(state.ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler
(state.RunWorkerCompleted);
worker.RunWorkerAsync();
}
return true;
}
else
{
MessageBox.Show("所选Excel文件的不是12张sheet,请重新选择正确的导入文件
;", "注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
}
else
return false;
}
void worker_DoWork_DaoRu(object sender, DoWorkEventArgs e)
{
using (BackgroundWorker worker = sender as BackgroundWorker)
{
for (int i = 0; i < 12;i++ )
{
AddDataTable(i);
string currentstate = "正在导入第" +(i+1).ToString()+ "张表";
worker.ReportProgress(i, currentstate);
// Thread.Sleep(0);
}
}
// throw new Exception("The method or operation is not implemented.");
}
private void AddDataTable(int i)
{
DataTable dt;
dt = ipfe.ExcelFromSheet(i, ofd.FileName);
if (dt != null)
{
ds_Excel.Tables.Add(dt.Copy());
}
else
MessageBox.Show("有空表!!");
}
}
public partial class Excel : Form
{
ExcelHelper eh = new ExcelHelper();
private void btnRead_Click(object sender, EventArgs e)
{
eh.GetExcelData();
int a = eh.ExcelDataSet.Tables.Count;
if (eh.ExcelDataSet.Tables.Count > 0)
{
dataGridViewRead1.DataSource = eh.ExcelDataSet.Tables[0];
dataGridViewRead2.DataSource = eh.ds_Excel.Tables[1];
dataGridViewRead3.DataSource = eh.ds_Excel.Tables[2];
dataGridViewRead4.DataSource = eh.ds_Excel.Tables[3];
dataGridViewRead5.DataSource = eh.ds_Excel.Tables[4];
dataGridViewRead6.DataSource = eh.ds_Excel.Tables[5];
dataGridViewRead7.DataSource = eh.ds_Excel.Tables[6];
dataGridViewRead8.DataSource = eh.ds_Excel.Tables[7];
dataGridViewRead9.DataSource = eh.ds_Excel.Tables[8];
dataGridViewRead10.DataSource = eh.ds_Excel.Tables[9];
dataGridViewRead11.DataSource = eh.ds_Excel.Tables[10];
dataGridViewRead12.DataSource = eh.ds_Excel.Tables[11];
}
}
}
第一个类是用来从Excel中获取一张Sheet的数据;
第二个类是从一个含有12张Sheet的Excel文件取数据,然后放到该类的DataSet 变量ds_Excel中;
第三个类是创建以个ExcelHelper 对象,然后取ds_Excel的数据在dataGridView显示;
我的问题是,在第二个类中加入了BackgroundWorker后,第三个类就获取不到ds_Excel的数据,或者说
,在第二个类的Dowork的实现函数中加入sleep(200)后,就没有数据了,请问高手如何解决???