日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

使用 IAsyncResult 进行 .NET 异步编程

發(fā)布時(shí)間:2025/3/17 asp.net 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 IAsyncResult 进行 .NET 异步编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微軟早在.net2.0, 也就是VS2005的時(shí)候,就提供了一整套的異步編程設(shè)計(jì)模式,有3中常用的方式:

1. 使用 IAsyncResult 調(diào)用異步方法

2. 使用委托進(jìn)行異步編程

3. 使用事件進(jìn)行異步多線(xiàn)程編程

注: IAsyncResult 方式通常是用委托來(lái)實(shí)現(xiàn)的。所以可以認(rèn)為前面2種方式就是一種。

http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx

使用 IAsyncResult 調(diào)用異步方法

1. 有兩個(gè)配對(duì)的方法,BeginXXX() 和 EndXXX()。它們是XXX()方法的異步執(zhí)行。

BegingXXX()的參數(shù)是在XXX()的參數(shù)基礎(chǔ)上增加 AsyncCallback 和 AsyncState。

EndXXX()的返回值和XXX()的返回值是一樣的。

例如

?

?

  • public?delegate?string?AsyncMethodCaller((object?param1,?object?param2);?
  • ???
  • public?class?AsyncDemo?
  • {?
  • ??
  • ?private?AsyncMethodCaller?_asyncDelegate?=?new?AsyncMethodCaller(Run);?
  • ??
  • ?public?IAsyncResult?BeginRun(object?param1,?object?param2,?AsyncCallback?asyncCallBack,?Object?asyncState)?
  • ??
  • ?{?
  • ??
  • ?asyncDelegate.BeginInvoke(param1,?param2,?callBack,?stateObject);??
  • ?}?
  • ??
  • ?public?object?EndRun(IAsyncResult?asyncResult)?
  • ??
  • {?
  • ??
  • m_asyncDelegate.EndInvoke(asyncResult);??
  • ?}?
  • ??
  • ?Public?object?Run(object?param1,?object?param2);??
  • }?
  • 2. IAsyncResult 對(duì)象中存儲(chǔ)有關(guān)異步操作的信息。

    3. 阻止應(yīng)用程序執(zhí)行的幾種方法

    a. 通過(guò)結(jié)束異步操作來(lái)阻止應(yīng)用程序執(zhí)行

    就是EndXXX() 調(diào)用時(shí),如果 IAsyncResult 對(duì)象表示異步操作未完成,則調(diào)用線(xiàn)程會(huì)被阻止,就是說(shuō)它之后的邏輯的會(huì)被阻止。

    ?

    ?

  • IAsyncResult?result?=?AsyncDemo.BeginRun(param1,?param2,?null,?null);?
  • ?
  • AsyncDemo.EndRun(result);?
  • ?
  • //?when?Run()?method?is?completed.?Continue?to?go.?
  • ?
  • ontinueToGo();?
  • ?

    ?

    b. 使用 AsyncWaitHandle 阻止應(yīng)用程序的執(zhí)行。

    在BeingXXX()之后調(diào)用 IAsyncResult.AsyncWAitHandle 中的相應(yīng)方法也可以阻止調(diào)用線(xiàn)程。例如

    ?

    ?

  • IAsyncResult?result?=?AsyncDemo.BeginRun(param1,?param2,?null,?null);?
  • ?
  • //?Wait?until?the?operation?completes.?
  • ?
  • result.AsyncWaitHandle.WaitOne();?
  • ?

    c. 輪詢(xún)異步操作的狀態(tài)。

    在BeingXXX()之后調(diào)輪詢(xún)IAsyncResult.IsCompleted屬性來(lái)確定此操作是否已完成

    ?

    ?

  • IAsyncResult?result?=?AsyncDemo.BeginRun(param1,?param2,?null,?null);?
  • ??
  • ?While(result.IsCompleted?!=?true)?
  • ??
  • ?{?
  • ??
  • ?//?Waiting?until?IsCompleted?is?true.??
  • ?}?
  • ??
  • ?//?when?Run()?method?is?completed.?Continue?to?go.?
  • ??
  • ?ContinueToGo();?
  • d. 使用 AsyncCallback 委托結(jié)束異步操作。

    就是在代理里面根據(jù)具體情況調(diào)用Endxxx()方法來(lái)讓調(diào)用線(xiàn)程繼續(xù)運(yùn)行。

    ?

    ?

  • Public?void?MainFunc()?
  • ??
  • ?{?
  • ??
  • ?AsyncCallback?callBack?=?new?AsyncCallback(Proce***un);?
  • ??
  • ?IAsyncResult?result?=?AsyncDemo.BeginRun(param1,?param2,?callBack,?null);?
  • ??
  • ?ContinueToGo();?
  • ??
  • ?}?
  • ??
  • ?Public?void?Proce***un(IAsyncResult?result)??
  • ?{?
  • ??
  • ?AsyncDemo.EndRun(result);?
  • ??
  • ?}?
  • ?

    轉(zhuǎn)載于:https://blog.51cto.com/powertoolsteam/528841

    總結(jié)

    以上是生活随笔為你收集整理的使用 IAsyncResult 进行 .NET 异步编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。