码迷,mamicode.com
首页 > Web开发 > 详细

.net 异步编程小结

时间:2015-08-25 16:47:35      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:异步编程

.net 异步编程小结

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Test
{
    public class MyMain
    {
        public delegate void Show();
        public delegate int Get(int key);


        /// <summary>
        /// .net4.5之前实现异步编程的四种方式(用BeginInvoke和EndInvoke实现)
        /// </summary>
        /// BeginInvoke 返回值可以判断异步是否执行完毕, 后两个参数第一个为回调方法,第二个为调用委托本身,前面的参数为调用委托的参数
        /// EndInvoke   返回值为调用委托的返回值
        static void show1()
        {
            Console.WriteLine("异步执行开始...");
            for (int i = 0; i < 200; i++)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("异步执行完毕...");
        }
        static int get(int key)
        {
            return key * 10;
        }


        /// <summary>
        /// .net4.5开始使用async和await进行异步编程
        /// </summary>
        /// 一个async方法里通常包含一个或多个的对应的await操作符,
        /// 但如果没有await表达式也不会导致编译错误。
        /// 但如果调用一个async方 法,
        /// 却不使用await关键字来标记一个挂起点的话,
        /// 程序将会忽略async关键字并以同步的方式执行
        async static Task<int> show3(int key)
        {
            Console.WriteLine("异步执行开始...");
            await Task.Delay(5000); //表示5秒后继续执行异步线程
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("异步执行完毕...");
            return key * 10;
        }

        static void Main()
        {
            //第一种方法:BeginEnvoke EndEnvoke方法,属于“等待”类。
            /*
            Show show = show1;
            Console.WriteLine("主线程执行开始...");
            IAsyncResult result = show.BeginInvoke(null, null);
            Console.WriteLine("主线程继续执行...");
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i * -1);
            }
            show.EndInvoke(result);//在这之前可以同时执行异步线程和主线程,在这之后异步线程结束,这行代码之后的行为才能开始执行,意思就是这行代码之后的行为需要等待异步线程执行完毕才能执行
            Console.WriteLine("主线程执行结束...");
             */


            //第二种方法:WaitOne。同样属于“等待”类。
            /*
            Show show = show1;
            Console.WriteLine("主线程执行开始...");
            IAsyncResult result = show.BeginInvoke(null, null);
            Console.WriteLine("主线程继续执行...");
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i * -1);
            }
            result.AsyncWaitHandle.WaitOne(); //WaitOne方法有多重重载体,具体查阅MSDN
            Console.WriteLine("主线程执行结束...");
             */


             //第三种方法:轮询。也是属于“等待”类。
            /*
            Show show = show1;
            Console.WriteLine("主线程执行开始...");
            IAsyncResult result = show.BeginInvoke(null, null);
            Console.WriteLine("主线程继续执行...");
            while(!result.IsCompleted)//可以在异步线程执行完毕之前做些事情
            {
                Console.WriteLine("...");
                Thread.Sleep(1000);
            }
            Console.WriteLine("主线程执行完毕...");
            */


            //第四种方法:回调。当然属于“回调”类.
            //异步方法没有返回值
            /*
            Show show = show1;
            Console.WriteLine("主线程开始执行...");
            show.BeginInvoke(callback1, show);
            Console.WriteLine("主线程执行完毕...");
            */
            /*
            //异步方法有返回值
            Get get_ = get;
            get_.BeginInvoke(1, callback2, get_);
            */

            //第五种方法:使用async 和 await 关键字 可以使异步使用像平常方法那样简单
            Console.WriteLine("主线程执行开始...");
            var tmp = show3(1);
            Console.WriteLine("主线程继续执行...");
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i * -1);
            }
            Console.WriteLine("主线程执行完毕...");
            Console.WriteLine(tmp.Result);


            Console.ReadKey();
        }
        //回调方法要求
        //1.返回类型为void
        //2.只有一个参数IAsyncResult
        static void callback1(IAsyncResult result)
        {
            (result.AsyncState as Show).EndInvoke(result);
            Console.WriteLine("异步线程执行已经完毕");
        }
        static void callback2(IAsyncResult result)
        {
            int key = ((Get)result.AsyncState).EndInvoke(result);
            Console.WriteLine(key);

        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

.net 异步编程小结

标签:异步编程

原文地址:http://blog.csdn.net/linukey/article/details/47977243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!