• 异步多线程实际操作


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

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

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

    如下是小编的实际操作:

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

    谢谢阅读!分享共进步!

  • 相关阅读:
    六. numpy数据矩阵
    十一.python面向对象(接口)abstractmethod,ABCMeta
    十.python面向对象(itme)
    九.python面向对象(双下方法内置方法)
    八. python面向对象(反射和内置方法)
    七. python面向对象(组合)
    六. python面向对象(内置函数)
    五. python面向对象(多态 和metaclass=abc.ABCMeta)
    四. python面向对象(继承)
    三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
  • 原文地址:https://www.cnblogs.com/imyao/p/5337402.html
Copyright © 2020-2023  润新知