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