国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#用委托BeginInvoke做異步線程

2020-01-24 00:11:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一個(gè)應(yīng)用場(chǎng)景,瀏覽器上傳一個(gè)文件,此文件后臺(tái)調(diào)用文件轉(zhuǎn)換,需要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,這樣,如果是一個(gè)線程同步式的做下去,那么用戶在瀏覽器上感覺(jué)就是卡住了,卡卡卡卡,這里我們利用委托的BeginInvoke和EndInvoke方法操作線程,BeginInvoke方法可以使用線程異步地執(zhí)行委托所指向的方法。然后通過(guò)EndInvoke方法獲得方法的返回值(EndInvoke方法的返回值就是被調(diào)用方法的返回值),或是確定方法已經(jīng)被成功調(diào)用,說(shuō)白了就是相當(dāng)于開(kāi)個(gè)多線程,你用戶文件保存了之后,響應(yīng)返回,這個(gè)BeginInvoke異步去執(zhí)行委托方法,完了之后呢,再執(zhí)行你的異步回調(diào)函數(shù);

大概步驟

1:先把你要異步執(zhí)行的方法抽離出來(lái);

2:定義一個(gè)該異步方法的委托;

3:在調(diào)用地方實(shí)例化這個(gè)委托;

4:調(diào)用此委托實(shí)例的BeginInvoke方法,在此方法里,前面填委托的參數(shù),接著是委托方法結(jié)束后的回調(diào)函數(shù);

5:寫(xiě)委托的回調(diào)函數(shù),回調(diào)函數(shù)是固定的參數(shù)(IAsyncResultIR)在這個(gè)里面,可以獲取用戶定義的對(duì)象,它限定或包含關(guān)于異步操作的信息(AsyncState)然后調(diào)用EndInvoke,獲取到委托方法結(jié)束的返回值。

6:調(diào)用自定義的回調(diào)函數(shù);

還是看代碼吧:

  public class anysFileChange  {    /// <summary>    /// 文件change后,其對(duì)應(yīng)的業(yè)務(wù)邏輯所需要做的變動(dòng)鎖調(diào)用的委托    /// 轉(zhuǎn)換完之后 會(huì)調(diào)用所執(zhí)行的函數(shù),用戶需要干什么,這個(gè)函數(shù)則交由用戶自己的邏輯完成    /// </summary>    public static anysChangingHandlerCallBack _handler = null;    /// <summary>    /// 轉(zhuǎn)換文件    /// </summary>    /// <param name="filepath">文件路徑</param>     /// <returns></returns>    public static void ChangingFile(string filepath, string attachId)    {      //開(kāi)啟異步轉(zhuǎn)換      DEGAsyncChangingFile acf = new DEGAsyncChangingFile(anysFileChange.AsyncChangeFileToswf);      acf.BeginInvoke(filepath, attachId, anysFileChange.CallBackAsync, acf);          }    /// <summary>    /// 異步函數(shù)執(zhí)行完后的的回調(diào)函數(shù)    /// </summary>    /// <param name="IR">異步結(jié)果 </param>    /// <returns></returns>    private static void CallBackAsync(IAsyncResult IR)    {      DEGAsyncChangingFile acf = (DEGAsyncChangingFile)IR.AsyncState;      ResultObj result = (ResultObj)acf.EndInvoke(IR);      //如果調(diào)用 文件轉(zhuǎn)換結(jié)束方法有定義 轉(zhuǎn)換結(jié)束需要做的委托那么執(zhí)行用戶定義的委托函數(shù)      if (_handler != null && result != null)      {        ///成功才執(zhí)行客戶自定義的回調(diào)函數(shù)        if (result.changestaus == EnumChangeStatus.SUCCESS)        {          _handler(result.filepath, result.attachId);        }      }    }    /// <summary>    /// 轉(zhuǎn)換文件    /// </summary>    /// <param name="filepath">文件路徑</param>     /// <returns>HSUFResultObj 返回結(jié)果對(duì)象</returns>    private static ResultObj AsyncChangeFileToswf(string filepath,string attachId)    {      ResultObj res = new ResultObj();      //轉(zhuǎn)換動(dòng)作      ConvertFile cf = new ConvertFile();      //cf這個(gè)類提供了一個(gè)寫(xiě)日志的事件 注冊(cè)一個(gè)寫(xiě)日志事件      cf.ConvertLog += new ConvertFile.ConvertLogHandler(Syslog);      //這里的cf這個(gè)類提供的方法,僅僅利用里面的轉(zhuǎn)換方法算了             cf.Convert(filepath);            if (cf.ChangeResult == EnumChangeStatus.SUCCESS)       {         res.attachId = attachId;                         res.filepath = filepath;         res.changestaus = cf.ChangeResult;       }       else       {         res.changeMessage = cf.convertMessage;         res.changestaus = cf.ChangeResult;       }      return res;    }    /// <summary>    /// 供注冊(cè)的日志事件    /// </summary>    /// <param name="messages"></param>    private static void Syslog(string messages)    {      string separateLine = "/r/n============================================================================================/r/n";      string log = string.Format(@"{0} {1} {2} {0}", separateLine, DateTime.Now.ToString(), messages);      // 如果上傳課程文件夾不存在,則創(chuàng)建      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();    }    /// <summary>    /// 文件轉(zhuǎn)換委托    /// </summary>    /// <param name="filepath">文件路徑</param>     /// <returns> </returns>    private delegate object DEGAsyncChangingFile(string filepath,string attachId);  }  /// <summary>  /// 結(jié)果集對(duì)象  /// </summary>  public class ResultObj  {    /// <summary>    /// 文件路徑    /// </summary>    public string filepath;    /// <summary>    /// id    /// </summary>    public string attachId;    /// <summary>    /// 轉(zhuǎn)換結(jié)果消息     /// </summary>    public string changeMessage;    /// <summary>    /// 轉(zhuǎn)換狀態(tài)    /// </summary>    public EnumChangeStatus changestaus;  }  /// <summary>  /// 文件轉(zhuǎn)換后,業(yè)務(wù)邏輯所需要調(diào)用的委托  /// </summary>  /// <param name="filepath">文件路徑</param>   public delegate void anysChangingHandlerCallBack(string filepath,string attchid);

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邯郸市| 济阳县| 原阳县| 定安县| 桐庐县| 临沂市| 乐平市| 兴安县| 合肥市| 雅江县| 淳安县| 东丰县| 大洼县| 文登市| 桃江县| 化德县| 叶城县| 德庆县| 临江市| 桂阳县| 玉树县| 忻州市| 上饶市| 邯郸市| 凤城市| 汉寿县| 西青区| 武宁县| 望江县| 托克托县| 宁陵县| 米脂县| 阿合奇县| 汉中市| 康保县| 花莲市| 鄂托克前旗| 嵊州市| 惠州市| 万山特区| 长岛县|