C#异步编程方式以及示例

1 篇文章 0 订阅
1 篇文章 0 订阅

C#异步编程,这里列举一下几种方式:

1、通过委托来实现异步(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法);

2、task(.net 4.0 新特性);

3、await async (.net4.5新特性);

下面看示例:

一、通过委托来实现异步

class Program
    {        
        static void Main(string[] args)
        {
            //通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法)
            string i = "参数";
            Console.WriteLine("调用异步方法前");
            PostAsync(i);
            Console.WriteLine("调用异步方法后");          

            Console.ReadKey();
        }

        #region 通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法)
          
        delegate void AsyncFoo(string i);
        private static void PostAsync(object i)
        {
            AsyncFoo caller = Myfunc;
            caller.BeginInvoke(i.ToString(), FooCallBack, caller);
        }

        //回调方法
        private static void FooCallBack(IAsyncResult ar)
        {
            var caller = (AsyncFoo)ar.AsyncState;
            caller.EndInvoke(ar);
        }

        /// <summary>
        /// 执行业务逻辑的方法
        /// </summary>
        /// <param name="i">调用异步时传过来的参数</param>
        private static void Myfunc(string i)
        {
            Console.WriteLine("通过委托来实现异步编程的");
        }

        #endregion
    }

运行结果(打印结果):


注意:PostAsync()方法也可以定义为包含两个以及两个以上的参数的方法如下:

class Program
    {        
        static void Main(string[] args)
        {
            PostAsync("参数1", "参数2");

            Console.ReadKey();
        }
                
        delegate void AsyncFoo(string i, string p);
        private static void PostAsync(string i, string p)
        {
            AsyncFoo caller = Myfunc;

            //FooCallBack,caller为额外的参数
            caller.BeginInvoke(i, p, FooCallBack, caller);
        }

        private static void FooCallBack(IAsyncResult ar)
        {
            var caller = (AsyncFoo)ar.AsyncState;
            caller.EndInvoke(ar);
        }

        private static void Myfunc(string i,string p)
        {
            Console.WriteLine(i);
            Console.WriteLine(p);
        }
    }


二、task(.net 4.0 新特性)

class Program
    {        
        static void Main(string[] args)
        {
            Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
            //Task方式一
            Task task1 = new Task(() => TaskFunc1());
            task1.Start();

            //Task方式二
            var result = Task.Run<string>(() => { return TaskFunc2(); });
            Console.WriteLine(result.Result);

            Console.ReadKey();
        }
        
        #region task

        private static void TaskFunc1()
        {
            Console.WriteLine("Task方式一开启的线程ID:" + Thread.CurrentThread.ManagedThreadId);
        }

        private static string TaskFunc2()
        {
            return "Task方式二开启的线程ID:" + Thread.CurrentThread.ManagedThreadId;
        }

        #en

运行结果(打印结果):



三、await async (.net4.5新特性)

class Program
    {        
        static void Main(string[] args)
        {
            Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
            var result1 = AsyncFunc1();
            Console.WriteLine(result1.Result);

            Console.ReadKey();
        }

        #region await async
        private static async Task<string> AsyncFunc1()
        {
            return await Task.Run(() =>
            {
                Console.WriteLine("await/async线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
                return "这是返回值";
            });

        }
        #endregion
    }

运行结果(打印结果):



代码下载:https://download.csdn.net/download/coderk2014/10536843

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值