乙個應用場景,瀏覽器上傳乙個檔案,此檔案後台呼叫檔案轉換,需要耗費相當長的時間,這樣,如果是乙個執行緒同步式的做下去,那麼使用者在瀏覽器上感覺就是卡住了,卡卡卡卡,這裡我們利用委託的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 引數...