C 用委託BeginInvoke做非同步執行緒

2022-09-26 03:12:11 字數 1905 閱讀 9004

乙個應用場景,瀏覽器上傳乙個檔案,此檔案後台呼叫檔案轉換,需要耗費相當長的時間,這樣,如果是乙個執行緒同步式的做下去,那麼使用者在瀏覽器上感覺就是卡住了,卡卡卡卡,這裡我們利用委託的begininvoke和endinvoke方法操作執行緒,begininvoke方法可以使用執行緒非同步地執行委託所指向的方法。然後通過endinvoke方法獲得方法的返回值(endinvoke方法的返回值就是被呼叫方法的返回值),或是確定方法已經被成功呼叫,說白了就是相當於開個多執行緒,你使用者檔案儲存了之後,響應返回,這個begininvoke非同步去執行委託方法,完了之後呢,再執行你的非同步**函式;

大概步驟

1:先把你要非同步執行的方法抽離出來;

2:定義乙個該非同步方法的委託;

3:在呼叫地方例項化這個委託;

4:呼叫此委託例項的begininvoke方法,在此方法裡,前面填委託的引數,接著是委託方法結束後的**函式;

5:寫委託的**函式,**函式是固定的引數(iasyncresultir)在這個裡面,可以獲取使用者定義的物件,它限定或包含關於非同步操作的資訊(asyncstate)然後呼叫endinvoke,獲取到委託方法結束的返回值。

6:呼叫自定義的**函式;

還是看**吧:

public class anysfilechange

///

/// 非同步函式執行完後的的**函式

///

/// 程式設計客棧m name="ir">非同步結果

///

private static void callbackasync(iasyncresult ir)}}

///

/// 轉換檔案

///

/// 檔案路徑《程式設計客棧/param>

/// hsufresultobj 返回結果物件

private static resultobj asyncchangefiletoswf(string filepath,string attachid)

else

return res;

}///

/// 供註冊的日誌事件

///

///

private static void syslog(string messages)

", separateline, datetime.now.tostring(), messages);

// 如果上傳課程資料夾不存在,則建立

if (!directory.exists(converconst.toolpath + "log\\"))

directory.createdirectory(converconst.toolpath + "log\\");

streamwriter sw = new streamwriter(converconst.toolpath+"log\\"+datetime.now.tostring("yyyy-mm-dd")+".txt", true);

sw.writeline(log);

sw.close();

}///

/// 檔案轉換委託

///

/// 檔案路徑

///

private delegate object degasyncchangingfile(string filepath,string attachid);

} ///

/// 結果集物件

///

public class resultobj

///

vzbvzfakn/// 檔案轉換後,業務邏輯所需要呼叫的委託

///

/// 檔案路徑

public delegate void anyschanginghandlercallback(string filepath,string attchid);

總結

委託非同步呼叫時BeginInvoke的陷阱處理

這個陷阱來自於乙個需求 需要非同步在後台處理資料,處理完後觸發處理完成的事件,大概是這麼寫的 employeecollection data new employeecollection data.loaded data loaded action action d action.begininvo...

C 委託 委託概述

c 委託概述 委託這個詞在生活中經常用到,委託律師打官司,委託房地產公司購買房子。委託保險 人辦理保險。委託就是把事情交給別人去辦。c 中的委託和生活中的委託很相似,如果將乙個方法委託給乙個物件,那麼這個物件就可以全權 這個方法執行。委託宣告定義乙個類,它是從 system.delegate 類派生...

C 委託 匿名委託

c 委託 匿名委託 委託變數在繫結方法時,是把方法名賦值給了委託變數名,這 樣就需要在類裡面定義方法,而有些方法只用到了 次,這樣的 方法在類裡面過多時,程式的可讀性就不是太好,針對這種情 況,可以使用匿名委託,即不用在類裡面額外定義方法.delegate定義的匿名委託 格式 delegate 引數...