对于一些比较耗时的操作,如小编的一个查询后台数据库生成报表,由于其中数据量大(千万条记录),并且与便有关联。
这时,除了我们在后台写存储过程的时候,可适当采用缓存和一些集合操作来提高后台效率。
同时在前台我们可以采用:异步多线程的操作手法,使得不至于卡在界面之中,如果有多个报表,也可以异步的进行,而不至于按顺序一一进行,可以大大提高效率。
如下是小编的实际操作:
1、首先定义委托:
public delegate DataTable MyDelegate(string year); //1、定义委托
2、定义一个方法,该方法用于和 上诉的委托绑定,注意参数一致。 这里我传递的参数是 years
static DataTable AsyncStart(string year) //2、定义线程 执行的函数 { CsDal dal = new CsDal(); DataTable dt = new DataTable (); dt = dal.GetPiciBackData1(year); //调用存储过程,获取数据,此处 主要是 处理业务逻辑,返回dt MessageBox.Show(year + "批次退机率 导出成功!"); return dt; }
3、定义一个回调函数,回调函数可以接受 我们调用时 传递的参数,以及可以对 被委托的方法的返回值进行操作。
下列的
IAsyncResult result 该参数是 异步线程执行之后返回的值,此处是 DataTable类型的,采用如下语句接受返回值。
DataTable dtReturn = myDelegate.EndInvoke(_result);
下列一句,是我们调用启动异步多线程时,传递的参数,注意:与上诉返回的结果是不同的。
string filePath = (string)result.AsyncState;
//3、定义 执行完毕函数,处理线程执行的返回结果 static void AsyncCompleted(IAsyncResult result) //result 是 线程执行之后返回值 { //MessageBox.Show("回调函数执行结束!ID 为:" + Thread.CurrentThread.ManagedThreadId); //获取委托对象,调用EndInvoke方法获取运行结果 AsyncResult _result = (AsyncResult)result; MyDelegate myDelegate = (MyDelegate)_result.AsyncDelegate; //获取在其上调用异步调用的委托对象。 DataTable dtReturn = myDelegate.EndInvoke(_result); //AsyncStart 函数的返回值 DataTable 类型 //获取参数,如下方式获取 传过来的参数string strFileName string filePath = (string)result.AsyncState; string fileName = filePath.Substring(filePath.LastIndexOf("\") + 1); //获取文件名 //执行导出Excel操作: NPOIHelper.Export(dtReturn, fileName, filePath); //导出Excel 报表格式 //flag1 = 0; //下载完毕,可再次操作 }
4、建立委托,将方法绑定到委托
MyDelegate myDelegate = new MyDelegate(AsyncStart); //4、建立委托
5、异步调用执行委托,并对参数(也可以进行封装之后)传递。
//5、异步调用委托,输入参数, 获取计算结果 myDelegate.BeginInvoke(year, new AsyncCallback(YearChoose.AsyncCompleted), strFileName); //第一个参数传给 异步 方法,第二个参数传给 异步回调函数
上诉过程按需求整合起来就能达到对 异步执行 查询数据库,并返回Datatable(还可以是其他)类型的返回值的 利用。在实际工程中也是比较使用的。
谢谢阅读!分享共进步!