异步委托练习之winfrom进度条

在学习异步之前,你要明白异步是干什么的,是什么概念的。

现在我说说我的理解,每一个程序都有一个甚至多个进程,每一个进程中都有程序域以及线程组成。单核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;
               
        }        

到这里异步部分已经写完了。感觉不是很满意,请大家给点意见

猜你喜欢

转载自www.cnblogs.com/yuxian/p/10293087.html