在学习异步之前,你要明白异步是干什么的,是什么概念的。
现在我说说我的理解,每一个程序都有一个甚至多个进程,每一个进程中都有程序域以及线程组成。单核cpu一个单位时间段只能运行一个线程。
哪么多线程是怎么回事呢,这其实是cpu在不停切换进程。在io操作中你要读写数据,数据量大的话,这个时候你最好单开一个线程。
当cpu读取一定的数据存在内存中时,这时候就可以干别的了。切换别的线程,当线程写了一些后,又切回来继续读取一些数据到内存中。这样操作会大大提升你的系统效率。
但是线程不宜过多,cpu切回线程是要时间的。一般的程序都只有一个主线程,就是main方法。
(也不知道说的对不对,只是我这段时间的理解,记录下,有不对的希望大家指出来)。
(转自:https://www.cnblogs.com/5566xzs/archive/2009/07/10/1520355.html)
下面给出我写的异步进度条写入到excel文件的代码:希望大家指正,或者提出跟高大上的方法
界面设计:
扫描二维码关注公众号,回复:
4986058 查看本文章
首先创建一个进度条帮助类
public class ProgressBarHelp { //是否开始读取 private bool IsRead; public bool IsRead1 { get { return IsRead; } set { IsRead = value; } }
//进度条最大值 private int MaxValue; public int MaxValue1 { get { return MaxValue; } set { MaxValue = value; } }
//进度条当前值 private int CurrentValue; public int CurrentValue1 { get { return CurrentValue; } set { CurrentValue = value; } } }
然后在调用窗体创建一个委托
private delegate void SetProgressBarValueHander<T>(String ExcelPath, String sql, DataTable dt, T t);
选择文件按钮点击事件
public string Excelput() { string saveFileName = ""; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.OverwritePrompt = false; saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel文件|*.xls"; //saveDialog.FileName = fileName; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) { return null; } else { return saveFileName; //被点了取消 } }
public void InsertExcelByData(String ExcelPath,String Sql,DataTable dgvDataTable,ProgressBarHelp progressBarHelp) {
//文件路径 string saveFileName = ExcelPath; if (saveFileName == null) { return; } // Thread thread = Thread.CurrentThread;
//创建excel进程 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel"); return; }
//获取工作铺集合 Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
//得到一个工作铺 Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
//得到一页 Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 //写入标题 for (int i = 0; i < dgvDataTable.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dgvDataTable.Columns[i].ColumnName; }
//设置最大值 progressBarHelp.MaxValue1 = dgvDataTable.Rows.Count; //写入数值 for (int r = 0; r < dgvDataTable.Rows.Count ; ) { for (int i = 0; i < dgvDataTable.Columns.Count; i++) {
//循环写入值 worksheet.Cells[r + 2, i + 1] = dgvDataTable.Rows[r][i].ToString(); } r++;
//写入一行后值加当前进度加1 progressBarHelp.CurrentValue1 = r;
//线程睡眠500豪秒 Thread.Sleep(500); } worksheet.Columns.EntireColumn.AutoFit();//列宽自适应 if (saveFileName != "") { try {
//是否保存 workbook.Saved = true;
//保存路径 workbook.SaveCopyAs(saveFileName); } catch (Exception ex) { MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message); } }
//关闭计时器 progressBarHelp.IsRead1 = false;
//退出程序 xlApp.Quit(); }
调用部分
private void button1_Click(object sender, EventArgs e) { if (myDgv == null) { return; } if (this.radioButton1.Checked) { button1.Enabled = false; button2.Enabled = true; pbh = new ProgressBarHelp(); textBox2.Text = (myDgv.DataSource as DataTable).ToString(); textBox1.Text = path; pbh.IsRead1 = true; timer1.Enabled = pbh.IsRead1; SetProgressBarValueHander<ProgressBarHelp> spvh = new SetProgressBarValueHander<ProgressBarHelp>(sqlHelp.InsertExcelByData); spvh.BeginInvoke(path, "Select * From [Sheet1$]", myDgv.DataSource as DataTable, pbh, new AsyncCallback(Dispose), null); } }
回调函数,告诉程序执行完了
private void Dispose(IAsyncResult Result) { timer1.Enabled = pbh.IsRead1; GC.Collect();//强行销毁 MessageBox.Show("文件: " + path + " 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); AsyncResult _Result = (AsyncResult)Result; SetProgressBarValueHander<ProgressBarHelp> Hander = _Result.AsyncDelegate as SetProgressBarValueHander<ProgressBarHelp>; Hander.EndInvoke(_Result); }
private void timer1_Tick(object sender, EventArgs e) { //pbh是一个ProgressBarHelp对象 if (pbh == null) return; progressBar1.Maximum = pbh.MaxValue1; progressBar1.Value = pbh.CurrentValue1; }
到这里异步部分已经写完了。感觉不是很满意,请大家给点意见