異步多線程實際操做

對於一些比較耗時的操做,如小編的一個查詢後臺數據庫生成報表,因爲其中數據量大(千萬條記錄),而且與便有關聯。數據庫

這時,除了咱們在後臺寫存儲過程的時候,可適當採用緩存和一些集合操做來提升後臺效率。緩存

同時在前臺咱們能夠採用:異步多線程的操做手法,使得不至於卡在界面之中,若是有多個報表,也能夠異步的進行,而不至於按順序一一進行,能夠大大提升效率。多線程

以下是小編的實際操做:異步

一、首先定義委託:函數

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(還能夠是其餘)類型的返回值的 利用。在實際工程中也是比較使用的。

謝謝閱讀!分享共進步!

相關文章
相關標籤/搜索