EndConvertPDF(System.IAsyncResult ar)//ar参数必须写,是线程执行完成后的回调函数 { if(sExecResult.IndexOf("isuccess")!=-1)bSuccess=true; else if(sExecResult.IndexOf("isfail")!=-1)bSuccess=false; //如果放在B/S系统,你可以在此处写数据库,是成功还是失败,并用一个WEBService程序不断检查数据库,此WEBService程序不放在该回调用函数中 //如果放在C/S系统,回调函数可以不放在类中,以便在窗体程序中调用结果 } } }
改写原来的button1_Click事件中的代码
private void button1_Click(object sender, System.EventArgs e) { ToPdf my2Pdf = new ToPdf("test.doc","c:\\"); ThreadStart thStartConvert = new ThreadStart(my2Pdf.StartConvertPDF); //开始异步调用线程 thStartConvert.BeginInvoke(new AsyncCallback(my2Pdf.EndConvertPDF),null);//设置异步线程的回调函数
//如果需要转换多个WORD,你可以用循环 //如果是B/S系统,可以将本段代码放在ASPX中,并结合客户端的无刷新显示数据的技术,不断访问WEBService程序,以确定PDF是否转换成功或失败 }
六:编写更加健壮的C#调用代码(实际考虑,可放在WINDOWS的服务程序中)
实际使用时,由于转化PDF时CPU的占用率很高,考虑只在同一时间转换一篇WORD文档,放弃异步线程的回调函数的使用,考虑一个WINDOWS的服务程序。
写一个函数CheckData2Convert(),不断的检查没有转换的WORD文档,并使用循环调用ToPdf类中执行转换方法StartConvertPDF
//以下给出,泛代码,用户按照自己的需求,填写完整即可 //bool bStart为全局变量,控制循环的进入与退出 //例:18:30开始检查并转换,那么18:30时,bStart=true;并启动转换线程 //6:30停止转换线程,bStart=fasle;
private void CheckData2Convert() { //检查指定目录下的没有转换的WORD文档,你同样可以检查数据库中记录的没有转换的WORD文档 string sPath = System.Threading.Thread.GetDomain().BaseDirectory; //当前的路径 while(bStart) { int iFileCount = CheckWord(); //CheckWord为一个方法,检查当前没有转换的WORD文档,返回没有转换的文件数,该方法的代码由读者自己编写 for(int i=0;i<iFileCount;i++) { string sWord = GetWordFileName(i) //GetWordFileName为一个方法,返回一个不带路径的WORD文件名,该方法的代码由读者自己编写 //ToPdf类中的StartConvertPDF()方法使用的是不带路径的WORD文件名 ToPdf my2Pdf = new ToPdf(sWord ,sPath); my2Pdf.StartConvertPDF();
if(my2Pdf.sExecResult.IndexOf("isuccess")!=-1) { //成功,写日志,或回写数据库 } else if(my2Pd 上一页 [1] [2] [3] [4] [5] 下一页 |