對於一些比較耗時的操做,如小編的一個查詢後臺數據庫生成報表,因爲其中數據量大(千萬條記錄),而且與便有關聯。數據庫
這時,除了咱們在後臺寫存儲過程的時候,可適當採用緩存和一些集合操做來提升後臺效率。緩存
同時在前臺咱們能夠採用:異步多線程的操做手法,使得不至於卡在界面之中,若是有多個報表,也能夠異步的進行,而不至於按順序一一進行,能夠大大提升效率。多線程
以下是小編的實際操做:異步
一、首先定義委託:函數
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(還能夠是其餘)類型的返回值的 利用。在實際工程中也是比較使用的。
謝謝閱讀!分享共進步!