.NET的异步调用和IAsyncResult接口

简介:

1.关于委托的BeginInvoke和EndInvoke方法

.NET Framework 允许您异步调用任何方法。为此,应定义与您要调用的方法具有相同签名的委托;公共语言运行库会自动使用适当的签名为该委托定义 BeginInvoke 和 EndInvoke 方法。

例如:

namespace carydemo2

{

    public class CaryAsync

    {       

        public string LongtimeOperation(int data, out int threadId)

        {

            Console.WriteLine("Long time operation begin");

            data = data + 123;

            Thread.Sleep(500);

            threadId = Thread.CurrentThread.ManagedThreadId;

            return String.Format("Data:{0}.", data.ToString());

        }

    }

   

    public delegate string CaryAsyncCaller(int data, out int threadId);

    public class CaryTest

    {

        private static int threadId;

        public static void Main()

        {           

            CaryAsync ca = new CaryAsync();

            CaryAsyncCaller caller = new CaryAsyncCaller(ca.LongtimeOperation);

            IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);

            Thread.Sleep(0);

            Console.WriteLine("Main thread :{0}", Thread.CurrentThread.ManagedThreadId);

            result.AsyncWaitHandle.WaitOne();

            while (result.IsCompleted == false)

            {

                Thread.Sleep(10);

            }

            string returnValue = caller.EndInvoke(out threadId, result);

            Console.WriteLine("The caller thread: {0}, Data :\"{1}\".", threadId, returnValue);

        }     

    }

}

调用你可以使用 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 属性来获取 WaitHandle。异步调用完成时会发出 WaitHandle 信号,而您可以通过调用 WaitOne 方法等待它。这样你就可以在异步调用完成之前或之后,在通过调用 EndInvoke 检索结果之前,还可以执行其他处理。 

可以使用由 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性来发现异步调用何时完成。 

还可以在调用完成时执行回调方法,代码如下:

    public class CaryTest

    {

        private static int threadId;

        public static void Main()

        {           

            CaryAsync ca = new CaryAsync();

            CaryAsyncCaller caller = new CaryAsyncCaller(ca.LongtimeOperation);

            IAsyncResult result = caller.BeginInvoke(3000, out threadId, new AsyncCallback(CaryCallBack), caller);

            Console.ReadLine();

 

        }

 

        static void CaryCallBack(IAsyncResult ar)

        {

            CaryAsyncCaller caller = (CaryAsyncCaller)ar.AsyncState;

            string returnValue = caller.EndInvoke(out threadId, ar);

            Console.WriteLine("The caller thread:{0},return value\"{1}\"", threadId, returnValue);

        }

    }

 

2.IAsyncResult接口:它表示异步操作的状态.该接口定义了4个公用属性,如下:

   AsyncState  获取用户定义的对象,它限定或包含关于异步操作的信息。

   AsyncWaitHandle  获取用于等待异步操作完成的 WaitHandle。

   CompletedSynchronously  获取异步操作是否同步完成的指示。

   IsCompleted  获取异步操作是否已完成的指示。 

 

IAsyncResult 接口由包含可异步操作的方法的类实现。它是启动异步操作的方法的返回类型,如 FileStream.BeginRead,也是结束异步操作的方法的第三个参数的类型,如 FileStream.EndRead。当异步操作完成时,IAsyncResult 对象也将传递给由 AsyncCallback 委托调用的方法。 

支持 IAsyncResult 接口的对象存储异步操作的状态信息,并提供同步对象以允许线程在操作完成时终止。 

3. AsyncCallback 委托      

引用在异步操作完成时调用的回调方法。AsyncCallback 引用的事件处理程序包含完成客户端异步任务的程序逻辑。AsyncCallback 使用 IAsyncResult 接口获取异步操作的状态。

下面为例子:

namespace carydemo1

{

    public class AsyncResult : System.IAsyncResult

    {

        public object AsyncState

        {

            get; set;

        }

        System.Threading.WaitHandle asyncWaitHandle = new AutoResetEvent(false);

        public System.Threading.WaitHandle AsyncWaitHandle

        {

            get { return asyncWaitHandle; }

        }

        public bool CompletedSynchronously

        {

            get; set;

        }

        public bool IsCompleted

        {

            get;

            set;

        }

 

        public int Data

        {

            set;get;

        }

    }

 

    class TestClass

    {

        AsyncCallback asyncCallback;

        AsyncResult asyncResult;

        public TestClass()

        {

            asyncCallback = new AsyncCallback(callback);

            asyncResult = new AsyncResult();

        }

        void callback(IAsyncResult asyncResult)

        {

            AsyncResult temp = asyncResult as AsyncResult;

            ((AutoResetEvent)temp.AsyncWaitHandle).Set();

        }

        public AsyncResult AsyncMethod(int value, object asyncState)

        {

            Console.WriteLine("Start...");

            this.asyncResult.AsyncState = asyncState;

            this.asyncResult.Data = value;

            Thread t = new Thread(new ThreadStart(myThread));

            t.Start();

            return this.asyncResult;

        }

        void myThread()

        {

            Console.WriteLine("begin ");

            for (int i = 0; i < 3; i++)

            {

                Console.WriteLine(i);

                asyncResult.Data = asyncResult.Data + i;

                Thread.Sleep(500);

            }

            Console.WriteLine("end...");

            asyncCallback(this.asyncResult);

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            TestClass obj = new TestClass();

            AsyncResult r = obj.AsyncMethod(50, null);

            r.AsyncWaitHandle.WaitOne();

            System.Console.WriteLine(r.Data);

            System.Console.WriteLine("完成");

            System.Console.Read();

        }

    }

}

 

 

本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/12/28/AsyncInvoke.html,如需转载请自行联系原作者

 

相关文章
|
XML 数据可视化 程序员
(一).NET Core WebAPI集成Swagger做接口管理
什么是Swagger? Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。 Swagger 有什么优势? 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需
(一).NET Core WebAPI集成Swagger做接口管理
|
4月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
|
4月前
|
JSON JavaScript 前端开发
全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
|
6月前
|
对象存储
.net core 阿里云接口之拷贝文件
紧接上文, 1)[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.12873639.article-detail.7.2b0e5b1cpeWbZ5 ".net core 阿里云接口之获取临时访问凭证") 2)[.net core 阿里云接口之将指定的OSS文件下载到流](https://developer.aliyun.com/article/1363886 ".net core 阿里云接口之将指定的OSS文件下载到流") 本文继续阿里云接口调用,将指定的OSS文件下载到流。
34 0
|
6月前
|
C# 对象存储
.net core 阿里云接口之将指定的OSS文件下载到流
紧接上文,[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.13262185.profile.8.180876540j71A9 ".net core 阿里云接口之获取临时访问凭证") 本文继续阿里云接口调用,将指定的OSS文件下载到流。 直接上代码: ```csharp /// <summary> /// 将指定的OSS文件下载到流 /// </summary> /// <param name="args"></param> /// <returns></returns> [H
126 0
|
6月前
|
对象存储 数据安全/隐私保护 开发者
.net core 阿里云接口之获取临时访问凭证
假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。 使用STS授权用户直接访问OSS的流程如下: ![image.png](https://ucc.alicdn.com/pic/developer-ecology/j2ygdazy447va_7d767aa1db4047778a7b5c568b5d7c11.png) ## 1、关于秘钥等信息的申请见如下链接 [使用STS临时访问凭证访问OSS](https://help.aliyun.com/zh/oss/developer
91 0
|
XML API 数据格式
十九、.net core使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口
使用SoapCore实现在.net core平台下开发webservice;以及使用HttpClientFactory动态访问webservice。首先,需要在包项目下面引用SoapCore:
818 0
十九、.net core使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
205 0
|
JavaScript 前端开发 API
.NET MVC第十章 vue axios解析web api接口
.NET MVC第十章 vue axios解析web api接口
189 0
.NET MVC第十章 vue axios解析web api接口
|
XML 开发框架 JSON
.NET MVC第八章、Web Api 跨域接口
.NET MVC第八章、Web Api 跨域接口
140 0
.NET MVC第八章、Web Api 跨域接口