`
xitong
  • 浏览: 6194133 次
文章分类
社区版块
存档分类
最新评论

.NET异步编程总结----四种实现模式

 
阅读更多

lz的前一篇文章简单的说了下异步,主要是从理解上来讲;这篇文章主要写具体的实现方法。实现异步编程有4种方法可供选择,这4种访求实际上也对应着4种异步调用的模式,分为“等待”和“回调”两大类。四种方法,我在代码中都进行了详细的注释,这里不罗嗦了,直接用代码说明吧

第一种方法:BeginEnvoke EndEnvoke方法,属于“等待”类。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 异步调用实现方法汇总
{
    /// <summary>
    /// 异步调用方法总结:
    /// 1.BeginEnvoke EndEnvoke
    /// 当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
    /// </summary>
    class Program
    {
        public delegate void PrintDelegate(string s);
        static void Main(string[] args)
        {
            PrintDelegate printDelegate = Print;
            Console.WriteLine("主线程");

            IAsyncResult result= printDelegate.BeginInvoke("Hello World.", null, null);
            Console.WriteLine("主线程继续执行...");
            //当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
            printDelegate.EndInvoke(result);

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }

        public static void Print(string s)
        {
            Console.WriteLine("异步线程开始执行:"+s);
            Thread.Sleep(5000);
        }
    }
}
复制代码

需要注意的地方,代码中都有注明了,程序运行结果如下:

第二种方法:WaitOne。同样属于“等待”类。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 异步调用实现方法汇总2
{
    /// <summary>
    /// 异步调用方法总结:
    /// 2.WaitOne
    /// 可以看到,与EndInvoke类似,只是用WaitOne函数代码了EndInvoke而已。
    /// </summary>
    class Program
    {
        public delegate void PrintDelegate(string s);
        static void Main(string[] args)
        {
            PrintDelegate printDelegate = Print;
            Console.WriteLine("主线程");
            IAsyncResult result = printDelegate.BeginInvoke("Hello World.", null, null);
            Console.WriteLine("主线程继续执行...");
            result.AsyncWaitHandle.WaitOne(-1, false);

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
        public static void Print(string s)
        {
            Console.WriteLine("异步线程开始执行:" + s);
            Thread.Sleep(5000);
        }
    }
}
复制代码

需要注意的地方,代码中都有注明了,程序运行结果如下:

第三种方法:轮询。也是属于“等待”类。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 异步调用实现方法汇总3
{
    /// <summary>
    /// 异步调用方法总结:
    /// 3.轮询
    /// 之前提到的两种方法,只能等下异步方法执行完毕,
    /// 在完毕之前没有任何提示信息,整个程序就像没有响应一样,用户体验不好,
    /// 可以通过检查IasyncResult类型的IsCompleted属性来检查异步调用是否完成,
    /// 如果没有完成,则可以适时地显示一些提示信息
    /// </summary>
    class Program
    {
        public delegate void PrintDelegate(string s);
        static void Main(string[] args)
        {
            PrintDelegate printDelegate = Print;
            Console.WriteLine("主线程:"+Thread.CurrentThread.ManagedThreadId );
            IAsyncResult result = printDelegate.BeginInvoke("Hello world.", null, null);
            Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId + ",继续执行...");
            while (!result.IsCompleted)
            {
                Console.WriteLine(".");
                Thread.Sleep(500);
            }

            Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId + "  Press any key to continue...");
            Console.ReadKey(true);
        }
        public static void Print(string s)
        {
            Console.WriteLine("当前线程:" + Thread.CurrentThread.ManagedThreadId + s);
            Thread.Sleep(5000);
        }
    }
}
复制代码

需要注意的地方,代码中都有注明了,程序运行结果如下:

第四种方法:回调。当然属于“回调”类。推荐!!!!

  之前三种方法者在等待异步方法执行完毕后才能拿到执行的结果,期间主线程均处于等待状态。回调和它们最大的区别是,在调用BeginInvoke时只要提供了回调方法,那么主线程就不必要再等待异步线程工作完毕,异步线程在工作结束后会主动调用我们提供的回调方法,并在回调方法中做相应的处理。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 异步调用实现方法汇总4
{
    /// <summary>
    /// 异步调用方法总结:
    /// 4.回调
    /// 之前三种方法者在等待异步方法执行完毕后才能拿到执行的结果,期间主线程均处于等待状态。
    /// 回调和它们最大的区别是,在调用BeginInvoke时只要提供了回调方法,那么主线程就不必要再等待异步线程工作完毕,
    /// 异步线程在工作结束后会主动调用我们提供的回调方法,并在回调方法中做相应的处理,例如显示异步调用的结果。
    /// </summary>
    class Program
    {
        public delegate void PrintDelegate(string s);
        static void Main(string[] args)
        {
            PrintDelegate printDelegate = Print;
            Console.WriteLine("主线程.");
            printDelegate.BeginInvoke("Hello world.", PrintComeplete, printDelegate);
            Console.WriteLine("主线程继续执行...");

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
        public static void Print(string s)
        { 
            Console.WriteLine("当前线程:"+s);
            Thread.Sleep(5000);
        }
        //回调方法要求
        //1.返回类型为void
        //2.只有一个参数IAsyncResult
        public static void PrintComeplete(IAsyncResult result)
        {
            (result.AsyncState as PrintDelegate).EndInvoke(result);
            Console.WriteLine("当前线程结束." + result.AsyncState.ToString());
        }
    }
}
复制代码

需要注意的地方,代码中都有注明了,程序运行结果如下:

分享到:
评论

相关推荐

    .NET异步编程总结----四种实现模式代码总结

    本篇文章主要介绍了.NET异步编程总结----四种实现模式,详细的介绍了每种方法的实现和实例,具有一定的参考价值,有兴趣的可以了解一下。

    .NET异步编程总结—-四种实现模式代码总结

    实现异步编程有4种方法可供选择,这4种访求实际上也对应着4种异步调用的模式,分为“等待”和“回调”两大类。四种方法,我在代码中都进行了详细的注释,这里不罗嗦了,直接用代码说明吧 第一种方法

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt ...微软.Net开发中的多线程编程总结.txt 线程中的参数传递.txt

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    ASP.NET MVC 3高级编程

    《asp.net mvc 3高级编程》 第1章 入门 1 1.1 asp.net mvc简介 1 1.1.1 asp.net mvc如何适应asp.net 1 1.1.2 mvc模式简介 2 1.1.3 mvc在web框架中的应用 2 1.1.4 asp.net mvc 3的发展历程 3 1.1.5 razor视图...

    ASP.NET+SQL房地产管理系统设计与实现(+源代码+thesis+任务书+工作总结+replyPPT).zip

    异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高负载情况下仍然能够流畅地使用应用程序。 性能优化:我们将使用一系列性能...

    亮剑.NET深入体验与实战精要2

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    CSDN 微软技术高级讲师.NET技术企业高级培训PPT

    (13) 异步委托的四种调用方法 (14) 什么是事件 (15) 定义事件 (16) 订阅事件 (17) 触发事件 (18) 引发事件 (19) 深入了解事件Event (20) 观察者模式 (21) Obseve模式结构 (22) Observer ...

    亮剑.NET深入体验与实战精要3

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    dot NET技术企业高级培训PPT

    (13) 异步委托的四种调用方法 (14) 什么是事件 (15) 定义事件 (16) 订阅事件 (17) 触发事件 (18) 引发事件 (19) 深入了解事件Event (20) 观察者模式 (21) Obseve模式结构 (22) Observer ...

    vc++ 开发实例源码包

    CCAMS系统是一种用于局域网下的CS模式的软件管理和监测系统源码 它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及...

    C#微软培训资料

    第一章 .NET 编程语 编程编程 编程 言 语言语言 语言 C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    UNIX高级编程 计算机科学丛书

    所有实例的源代码文件都可经Internet用匿名ftp取到,其主机站点是ftjp.uu.net,文件名是published/books/stevens.advprog.tar.Z。在你的机器上可对这些源代码进行修改并运行它们。 用于测试实例的系统 不幸的是所有...

    Mastering Web Application Development with AngularJS

    Peter Bacon Darwin已经积累了20年以上的编程经验,他在.NET发布之前,就已经用它工作了。他还对IronRuby的开发有所贡献。他曾在Avanade和IMGROUP做IT顾问。退休后,自由开发和照顾孩子占用了他大部分的时光。Peter...

    精通AngularJS part1

    Peter Bacon Darwin已经积累了20年以上的编程经验,他在.NET发布之前,就已经用它工作了。他还对IronRuby的开发有所贡献。他曾在Avanade和IMGROUP做IT顾问。退休后,自由开发和照顾孩子占用了他大部分的时光。Peter...

Global site tag (gtag.js) - Google Analytics