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

首頁 > 學院 > 開發設計 > 正文

[C#]異步委托使用小計

2019-11-14 16:47:27
字體:
來源:轉載
供稿:網友

APM(=Asynchronous PRogramming Model(=異步編程模型))

使用 IAsyncResult 設計模式的異步操作是通過名為 Begin操作名稱 和 End操作名稱 的兩個方法來實現的,這兩個方法分別開始和結束異步操作 操作名稱。  例如,FileStream 類提供 BeginRead 和 EndRead 方法來從文件異步讀取字節。 這兩個方法實現了 Read 方法的異步版本。 在調用 Begin操作名稱 后,應用程序可以繼續在調用線程上執行指令,同時異步操作在另一個線程上執行。  每次調用 Begin操作名稱 時,應用程序還應調用 End操作名稱 來獲取操作的結果。 ——MSDN

image

image

BeginInvoke 方法啟動異步調用。 該方法與您需要異步執行的方法具有相同的參數,還有另外兩個可選參數。第一個參數是一個 AsyncCallback 委托,該委托引用在異步調用完成時要調用的方法。 第二個參數是一個用戶定義的對象,該對象將信息傳遞到回調方法。BeginInvoke 立即返回,不等待異步調用完成。 BeginInvoke 返回一個 IAsyncResult,后者可用于監視異步調用的進度。

EndInvoke 方法檢索異步調用的結果。 在調用 BeginInvoke 之后隨時可以調用該方法。 如果異步調用尚未完成,則 EndInvoke 會一直阻止調用線程,直到異步調用完成。 EndInvoke 的參數包括您需要異步執行的方法的 out 和 ref 參數(在 Visual Basic 中為 <Out>  ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。

無論您使用何種方法,都要調用 EndInvoke 來完成異步調用

異步執行方法的最簡單方式是通過調用委托的 BeginInvoke 方法來開始執行方法,在主線程上執行一些操作,然后調用委托的 EndInvoke 方法。 EndInvoke 可能會阻止調用線程,因為該方法直到異步調用完成后才返回。 這種方式非常適合執行文件或網絡操作。因為 EndInvoke 可能會阻塞,所以不應從服務于用戶界面的線程調用該方法。

——MSDN

1.普通示例

using System;using System.Runtime.Remoting.Messaging;namespace Consoleapplication18{    class Program    {        static void Main(string[] args)        {            Func<string, string> _processTimeFunc = new Func<string, string>((string arg) =>            {                return string.Format("{0} {1}", arg, DateTime.Now);            });            _processTimeFunc.BeginInvoke("Beijing ", InvokeTimeFuncEnd, _processTimeFunc);//將委托作為參數傳遞            _processTimeFunc.BeginInvoke("Shanghai ", InvokeTimeFuncEnd2, null);//參數為空            Console.ReadLine();        }        private static void InvokeTimeFuncEnd2(IAsyncResult ar)        {            AsyncResult _asyncResult = (AsyncResult)ar;            Func<string, string> _processTimeFunc = (Func<string, string>)_asyncResult.AsyncDelegate;//獲取委托            Console.WriteLine(_processTimeFunc.EndInvoke(ar));        }        private static void InvokeTimeFuncEnd(IAsyncResult ar)        {            Func<string, string> _processTimeFunc = (Func<string, string>)ar.AsyncState;            Console.WriteLine(_processTimeFunc.EndInvoke(ar));        }    }}
代碼效果

image

 

2.IsCompleted使用示例

using System;namespace ConsoleApplication18{    class Program    {        static void Main(string[] args)        {            Func<string, string> _processTimeFunc = new Func<string, string>((string arg) =>           {               return string.Format("{0} {1}", arg, DateTime.Now);           });            IAsyncResult _result = _processTimeFunc.BeginInvoke("Beijing ", null, null);            while (!_result.IsCompleted)            {                Console.Write(".....");            }            Console.WriteLine("/r/n" + _processTimeFunc.EndInvoke(_result));            Console.ReadLine();        }    }}

代碼效果

image

 

3.超時設置

using System;using System.Threading;namespace ConsoleApplication18{    class Program    {        static void Main(string[] args)        {            Func<string, string> _processTimeFunc = new Func<string, string>((string arg) =>           {               Thread.Sleep(6000);               return string.Format("{0} {1}", arg, DateTime.Now);           });            IAsyncResult _result = _processTimeFunc.BeginInvoke("Beijing ", null, null);            if (_result.AsyncWaitHandle.WaitOne(5000, true))                Console.WriteLine("/r/n" + _processTimeFunc.EndInvoke(_result));            else                Console.WriteLine("執行超時...");            Console.ReadLine();        }    }}
代碼效果

image


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安阳县| 昌江| 金乡县| 乐至县| 富川| 镶黄旗| 丰县| 沂水县| 五大连池市| 东阳市| 富蕴县| 新昌县| 广昌县| 青河县| 砚山县| 县级市| 新建县| 麻江县| 芒康县| 湖北省| 西华县| 休宁县| 迭部县| 长丰县| 勐海县| 和田县| 夏津县| 和顺县| 高淳县| 莆田市| 深圳市| 昭平县| 淮滨县| 沅江市| 邯郸市| 上林县| 土默特右旗| 盐池县| 壶关县| 山丹县| 格尔木市|