c#使用委托实现异步调用

异步

异步编程是受公共语言运行库的许多领域(如远程处理、ASP.NET 和 Windows 窗体)支持的功能。异步编程是 .NET Framework 中的核心概念。使用 .NET 异步编程,在程序继续执行的同时对 .NET 类方法进行调用,直到进行指定的回调为止;或者如果没有提供回调,则直到对调用的阻塞、轮询或等待完成为止。

异步编程是由 .NET Framework 的许多区域支持的功能,这些区域包括:

文件 IO、流 IO、套接字 IO
网络:HTTP、TCP
远程处理信道(HTTP、TCP)和代理
使用 ASP.NET 创建的 XML Web services
ASP.NET Web 窗体
使用 MessageQueue 类的消息队列
异步委托
.NET Framework 允许异步调用任何方法。定义与需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法用于启动异步调用。它与需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)。BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。
EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。EndInvoke 的参数包括需要异步执行的方法的 out 和 ref 参数以及由 BeginInvoke 返回的 IAsyncResult。
调用了 BeginInvoke 后,可以:

进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。
使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke。
轮询由 BeginInvoke 返回的 IAsyncResult,确定异步调用何时完成,然后调用 EndInvoke。
将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。  
下面是一个使用委托调用异步方法的例子。实例中首先定义了一个AddDelegate类型委托add,并将方法Add绑定到委托实例上。然后定义了IAsyncResult接口类型实例iAR并调用委托add的BeginInvoke方法用于启动异步调用。由于异步调用完成时会发出 WaitHandle 信号,因此可以通过iAR.AsyncWaitHandle.WaitOne();来等待它,在这期间主程序可以执行一些其他的任务以达到程序异步执行的效果。最后调用EndInvoke 方法用于检索异步调用结果。值得注意的是如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。

 

using System;
using System.Threading;

//使用委托调用异步方法的例子
namespace DelegateCallAsynchronousMethods
...{

    class AsyncDelegatesBlocked
    ...{
        public static int Add(int op1, int op2, out int result)
        ...{
            Thread.Sleep(3000); // Simulating work
            return (result = op1 + op2);
        }
        public delegate int AddDelegate(int op1, int op2,
            out int result);//声明AddDelegate委托

        static void Main()
        ...{
            int result;
            /**//*定义一个AddDelegate类型委托add,将方法Add绑定到委托实例上*/
            AddDelegate add = new AddDelegate(Add);

            Console.WriteLine("[Main] Invoking the asynchronous " +
                "Add method");

            /**//*BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,还有两个额外的参数
             *BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。*/
           
            //定义IAsyncResult接口类型实例iAR
            //6, 42, out result为异步执行的方法的参数列表
            IAsyncResult iAR = add.BeginInvoke(6, 42, out result, 
                null, null);

            // Here we're simulating doing some work before
            // blocking on the Add method's completion.
            Console.Write("[Main] Doing other work");
            for (int i = 0; i < 10; i++)
            ...{
                Thread.Sleep(200);
                Console.Write(".");
            }

            Console.WriteLine(" [Main] Waiting for Add to finish");
            /**//*使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,
             * 使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke。
             * 注意:异步调用完成时会发出 WaitHandle 信号,可以通过WaitOne 来等待它*/
            iAR.AsyncWaitHandle.WaitOne();

            Console.WriteLine("[Main] Add finished, cleaning up");
            /**//*EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;
             * 如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。
             * EndInvoke 的参数包括所需要异步执行的方法的 out 和 ref 参数以及由 BeginInvoke 返回的 IAsyncResult。*/
            add.EndInvoke(out result, iAR);

            Console.WriteLine("[Main] The result is {0}", result);
            Console.ReadLine();
        }
    };

}

时间: 2025-01-30 08:55:29

c#使用委托实现异步调用的相关文章

艾伟_转载:C# 委托的同步调用和异步调用

委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System;using System.Threading;public delegate int AddHandler(int a, int b);public class Foo {static void Main() { Console.WriteLine("**********SyncInvokeTest**************&

C# 委托的同步调用和异步调用

委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System; using System.Threading; public delegate int AddHandler(int a, int b); public class Foo { static void Main() { Console.WriteLine("**********SyncInvokeTest***********

c# uwp-C#同/异步委托使用和调用,请指教

问题描述 C#同/异步委托使用和调用,请指教 public delegate void GetResultEventHandler(object sender, bool IsSucceed, string DataResults); public event GetResultEventHandler OnGetInfoCompleted; public void GetPostHtmlResults(string GetURL, int GetTimeOut) { HttpWebReques

.Net组件程序设计之异步调用

说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和 BeginInvoke(), 要想让自己的组件可以被客户端调用或者是异步调用,这样的设计是合理的,这也是组件异步机制当中的一条 (说句题外话--其实大多数知识都隐藏在我们平时经常见到的对象或者是代码里,只不过是没有去细心的发现) 在.NET中首先就会想到使用委托来进行异步调用,关于委托的定义在 委托与事件一文中已经大概的说过了,文中只是对委托进行了 大概的讲解,并没有对委托的使用来说

C# 2.0 匿名方法与 Windows Forms 异步调用

window|异步 C# 2.0 匿名方法大大简化了 Windows Forms 异步调用的实现,我们再也不用手工定义异步委托或者包装类了.例如,在下面的代码示例中,Form1 有一个按钮控件和一个列表控件,在按钮控件的单击事件里,我们新建一个线程,在这个线程中向列表控件添加 10 个项目: public class Form1 : System.Windows.Forms.Form{ private System.Windows.Forms.ListBox listBox1; private

序列化和反序列化,异步调用web/wcf/函数

//xml序列化 public static string Seria(DataSet ds) { XmlSerializer serializer = new XmlSerializer(typeof(DataSet)); StringBuilder sb = new StringBuilder(); XmlWriter writer = XmlWriter.Create(sb); serializer.Serialize(writer, ds); return sb.ToString();

asp.net C# 异步调用的处理方法

A.   用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数.    B.   而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke.此种方法,是在回调函数中调用EndInvoke的.      异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了. 一个最简单的异步调用  代码如下

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失