C#異步編程方式以及示例

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章