异步多线程实际操作

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

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

同时在前台我们可以采用:异步多线程的操作手法,使得不至于卡在界面之中,如果有多个报表,也可以异步的进行,而不至于按顺序一一进行,可以大大提高效率。

如下是小编的实际操作:

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

谢谢阅读!分享共进步!

原文地址:https://www.cnblogs.com/imyao/p/5337402.html