当前位置:编程学习 > C#/ASP.NET >>

C#.net 代码优化

一下是小弟的一段代码,运行起来速度比较慢,点下按钮到保存好文档并打开需要2-5秒不等。请各位.net达人帮忙指点一下,怎么才能优化一下性能。顺便指导一下在这个打印过程中怎样方便的添加一个进度条。小弟是.net菜鸟,不胜感激.
//打印按钮处理
        private void print_btn_Click(object sender, EventArgs e)
        {
            // 取得画面上的数据
            System.Data.DataTable objDataTable = GetDgvData();
            // 打印取得的数据
            if (objDataTable.Rows.Count < 1)
            {
                MessageBox.Show("画面上没有可以打印的数据,请确认!");
            }
            else
            {
                string tempPoNo = string.Empty;
                tempPoNo = this.pono_tbx.Text.Trim() ;
                string tempInvoice = string.Empty;
                tempInvoice = this.invoice_tbx.Text.Trim();
                string invoiceNo = string.Empty;
                if ("".Equals(tempInvoice))
                {
                    MessageBox.Show("画面上没有输入正确的Invoice#数据,保存的文档将直接以P.O.#命名!");
                    invoiceNo = tempPoNo;
                }
                else
                {
                    invoiceNo = tempInvoice.Substring(0, 7);
                }
                
                // 单据名称
                string formName = IniFA.ifa.IniReadValue("system_Inf", "INVOICE_RECORD");
                // 模板取得
                //string filename = @printAddress + sysDate + "_" + tempPoNo + "_" + formName;
                string filename = @printAddress + invoiceNo + "_" + formName;
                FileInfo mode = new FileInfo(templateAddress + formName);
                try
                {
                    mode.CopyTo(filename, true);
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                    return;
                }
                Excel.Application objApp = new Excel.Application();
                Excel.Workbooks workbooks = objApp.Workbooks;
                object missing = Missing.Value;
                workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                Excel.Sheets objSheets = objApp.Worksheets;
                Excel._Worksheet objSheet;
                //采用索引的方式规定写入Index张的工作表 
                objSheet = (Excel._Worksheet)objSheets.get_Item(1);
                // 设定item数据
                int dataCount = objDataTable.Rows.Count;
                if (dataCount > 20)
                {
                    MessageBox.Show("数据行数超过20行,请修改模板!");
                    return;
                }
                // 循环写入数据
                for (int i = 0; i < dataCount; i++)
                {
                    string item = GetStr(objDataTable.Rows[i]["item"]);
                    string description = GetStr(objDataTable.Rows[i]["description"]);
                    string quantity = GetStr(objDataTable.Rows[i]["quantity"]);
                    string unit = GetStr(objDataTable.Rows[i]["unit"]);
                    string unit_price = GetStr(objDataTable.Rows[i]["unit_price"]);
                    string extened_US = GetStr(objDataTable.Rows[i]["extened_US"]);

                    objSheet.Cells[i + 19, 2] = item;
                    objSheet.Cells[i + 19, 4] = description;
                    objSheet.Cells[i + 19, 13] = quantity;
                    if ("".Equals(unit))
                    {
                        objSheet.Cells[i + 19, 15] = "pcs";

                    }
                    else {
                        objSheet.Cells[i + 19, 15] = unit;
                    }
                    objSheet.Cells[i + 19, 17] = unit_price;
                    objSheet.Cells[i + 19, 19] = extened_US;
                }
                //设定其他数据
                string tempRefCode = string.Empty;
                string tempDate;
                string tempTo = string.Empty;
                string tempAddress = string.Empty;
                string tempAddress2 = string.Empty;
                string tempAddress3 = string.Empty;
                string tempAttn = string.Empty;
                string tempDeliveryTime = string.Empty;
                string tempPayment = string.Empty;
                string tempSayUsDollars = string.Empty;
                string tempTotal = string.Empty;
                string tempBalance = string.Empty;
                string tempP_Balance = string.Empty;
                string tempRemark1 = string.Empty;
                string tempRemark2 = string.Empty;
                tempRefCode = this.ref_code_tbx.Text.Trim();
                tempDate = this.date_dtp.Value.ToShortDateString().ToString();
                tempTo = this.to_tbx.Text.Trim();
                tempAddress = this.address_tbx.Text.Trim();
                tempAddress2 = this.address2_tbx.Text.Trim();
                tempAddress3 = this.address3_tbx.Text.Trim();
                tempAttn = this.attn_tbx.Text.Trim();
                tempDeliveryTime = this.delivery_time_dtp.Value.ToShortDateString().ToString();
                tempPayment = this.payment_tbx.Text.Trim();
                tempSayUsDollars = this.say_US_dollars_tbx.Text.Trim();
                tempRemark1 = this.remark1_tbx.Text.Trim();
                tempRemark2 = this.remark2_tbx.Text.Trim();
                if (!"".Equals(this.total_tbx.Text.Trim()))
                {
                    tempTotal = this.total_tbx.Text.Trim();
                }
                if (!"".Equals(this.balance_tbx.Text.Trim()))
                {
                    tempBalance = this.balance_tbx.Text.Trim();
                }
                tempP_Balance = this.p_balance_tbx.Text.Trim();

                objSheet.Cells[10, 19] = tempPoNo;
                objSheet.Cells[11, 19] = tempInvoice;
                objSheet.Cells[12, 19] = tempRefCode;
                objSheet.Cells[13, 19] = tempDate;
                objSheet.Cells[10, 3] = tempTo;
                objSheet.Cells[11, 3] = tempAddress;
                objSheet.Cells[12, 3] = tempAddress2;
                objSheet.Cells[13, 3] = tempAddress3;
                objSheet.Cells[14, 3] = tempAttn;
                if (!"".Equals(tempDeliveryTime))
                {
                    objSheet.Cells[39, 2] = "Delivery time:";
                    objSheet.Cells[39, 4] = tempDeliveryTime;
                }
                if (!"".Equals(tempPayment))
                {
                    objSheet.Cells[40, 2] = "Payment:";
                    objSheet.Cells[40, 4] = tempPayment;
                }
                if (!"".Equals(tempRemark1))
                {
                    objSheet.Cells[41, 2] = "Remark:";
                    objSheet.Cells[41, 4] = tempRemark1;
                }
                if (!"".Equals(tempRemark2))
                {
                    objSheet.Cells[42, 4] = tempRemark2;
                }
                objSheet.Cells[44, 2] = tempSayUsDollars;

                if ((!"".Equals(this.balance_tbx.Text.Trim())) && (0 != Convert.ToDecimal(this.balance_tbx.Text.Trim())))
                {
                    if (100 > Convert.ToInt32(this.p_balance_tbx.Text.Trim()))
                    {
                        objSheet.Cells[44, 15] = tempP_Balance + "% Balance:";
                        objSheet.Cells[44, 19] = this.balance_tbx.Text.Trim();
                    }
                    else
                    {
                        objSheet.Cells[44, 15] = "TOTAL:";
                        objSheet.Cells[44, 19] = this.total_tbx.Text.Trim();
                    }
                }
                else
                {
                    objSheet.Cells[44, 15] = "TOTAL:";
                    objSheet.Cells[44, 19] = this.total_tbx.Text.Trim();
                }
                

                //去掉保存的对话框,若肯定无重复的文件或需要提示,将下面两行注释即可 
                objApp.DisplayAlerts = false;
                objSheet.SaveAs(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                objApp.Workbooks.Close();
                //退出依然会驻留的进程 
                objApp.Quit();
                System.GC.Collect();
                MessageBox.Show("已经将单子保存到" + printAddress + "目录下面!");
                // 打开生成的excel文件
                System.Diagnostics.Process.Start(filename);
            }
        } --------------------编程问答-------------------- --------------------编程问答-------------------- 先要知道哪段代码耗时
写下log看看

进度条的问题, 可以通过后台线程来处理,完成一步通知一次界面, 直到最终完成
假死确实对用户体验很不好 --------------------编程问答-------------------- 因为你的代码全都在表示层里,在进行保存的时候,编译器要全部编译一便,代码少的话是不会等那么长时间的,如果代码多的话,那编译耗费的时间肯定长了。程序的运行速度自然就慢了。
.....知道三层架构么??
如果编写的时候是用三层架构的,将要访问数据库的那段代码都放到数据访问层,逻辑判断放到业务逻辑层,在表示层只要调用业务逻辑层的方法就可以了。 --------------------编程问答-------------------- 三层架构 或许会好点吧 
  这个我还没遇到过  --------------------编程问答-------------------- 你调用Excel来帮你存文件,不慢才怪。 --------------------编程问答-------------------- 好好学习天天向上 --------------------编程问答-------------------- na ni 好好弄 --------------------编程问答-------------------- 单元测试主要是哪里影响效率
--------------------编程问答-------------------- use profiler to check which function uses most of the time,

like this one:
http://www.jetbrains.com/profiler/index.html

visual studio has a built in profiler, F1  --------------------编程问答--------------------  for (int i = 0; i < dataCount; i++)
  {
  string item = GetStr(objDataTable.Rows[i]["item"]);
  string description = GetStr(objDataTable.Rows[i]["description"]);
  string quantity = GetStr(objDataTable.Rows[i]["quantity"]);
  string unit = GetStr(objDataTable.Rows[i]["unit"]);
  string unit_price = GetStr(objDataTable.Rows[i]["unit_price"]);
  string extened_US = GetStr(objDataTable.Rows[i]["extened_US"]);

  objSheet.Cells[i + 19, 2] = item;
这部分最耗时间。 objSheet.Cells每个EXCEL格挨个遍历赋值。
建议 把数据放在数组 用objSheet。range(区域,数组)

这样会提高N倍速度。 --------------------编程问答-------------------- 明显是启动Excel耗的时间

直接用流输出生成Exxcel格式的文件,别启动Excel程序 --------------------编程问答-------------------- 代码太多啦!~~!~~~~~~~~~~~~~~~ --------------------编程问答-------------------- 创建excel的application对象是很费时间的,花个2秒钟打开一个excel已经算是飞速了
这个和架构无关,就算用N层结构都没用
--------------------编程问答-------------------- 你能少用点if 多用点switch吗 --------------------编程问答-------------------- 优化,至少你也把代码拆成多个方法。一个方法完成一个任,别全部写在一个方法里。 --------------------编程问答-------------------- 顶。。。。。。。。。。。 --------------------编程问答-------------------- Excel  那的事吧。   --------------------编程问答-------------------- ding! --------------------编程问答-------------------- 面向对象 --------------------编程问答-------------------- --------------------编程问答-------------------- 我也学习学习、、、、 --------------------编程问答--------------------
友情帮顶下!顺便学习学习!
--------------------编程问答--------------------
引用 12 楼 xk1126 的回复:
代码太多啦!~~!~~~~~~~~~~~~~~~

呵呵,楼上太搞笑了吧 --------------------编程问答-------------------- 我也写过一个解析excel的东东,慢的跟驴一样 --------------------编程问答-------------------- EXcel --------------------编程问答-------------------- excel就是这么慢。 --------------------编程问答-------------------- 我也觉得用流导出excel会比较快! --------------------编程问答-------------------- 好长。。慢慢看 --------------------编程问答-------------------- 慢慢跑,看哪费时,在优化 --------------------编程问答-------------------- 路过 学习..... --------------------编程问答-------------------- 飘过 学习 --------------------编程问答-------------------- 你先单步跟踪试试啊,如果循环次数多了,那就没法优化 --------------------编程问答-------------------- 你用了office的COM组件,要手动释放该组件的资源 --------------------编程问答-------------------- 应该是打开EXCEL的问题吧,一般电脑打开个EXCEL5秒左右吧,特别是office2007之后,打开更慢
--------------------编程问答-------------------- 一定要用流的方式来操作Excel 使用OleDB可以直接连Excel文件的 然后使用Sql语句直接操作Excel的Sheet 一个Sheet就是一张表 --------------------编程问答-------------------- 1. 2到5秒,其实不算很长
2. 请问目前的数据量有多大,如果数据量大,2到5秒,完全可以认为是正常的。如果只有几百条数据,那么最关键的地方是Excel.Application objApp = new Excel.Application();这块。这种方式会启动excel进程,这个过程本身也需要差不多2秒时间。而且这种方式最麻烦的是excel进程一般并随程序关闭而关闭严重占用资源

3.建议使用非vsto方式开发,比如nopi,openxml这类无需office本身支持的方式开发
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,