异步多线程实际操做

对于一些比较耗时的操做,如小编的一个查询后台数据库生成报表,因为其中数据量大(千万条记录),而且与便有关联。数据库

这时,除了咱们在后台写存储过程的时候,可适当采用缓存和一些集合操做来提升后台效率。缓存

同时在前台咱们能够采用:异步多线程的操做手法,使得不至于卡在界面之中,若是有多个报表,也能够异步的进行,而不至于按顺序一一进行,能够大大提升效率。多线程

以下是小编的实际操做:异步

一、首先定义委托:函数

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(还能够是其余)类型的返回值的 利用。在实际工程中也是比较使用的。

谢谢阅读!分享共进步!

相关文章
相关标签/搜索