zoukankan      html  css  js  c++  java
  • 异步多线程实际操作

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

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

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

    如下是小编的实际操作:

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

    谢谢阅读!分享共进步!

  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/imyao/p/5337402.html
Copyright © 2011-2022 走看看