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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/coderK2014/article/details/81012004

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

展开阅读全文

没有更多推荐了,返回首页