await和async

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

namespace await和async
{
    class Program
    {
        static void Main(string[] args)
        {
            //AwaitAsync();
            //TaskRun();

            AwaitTaskRun();

        }


        #region await和async
        private static void AwaitAsync()
        {
            Say();                             //因爲Main不能使用async標記
            Console.ReadLine();
        }


        private async static void Say()
        {
            var t = TestAsync();
            Thread.Sleep(1100);                                     //主線程在執行一些任務
            Console.WriteLine("Main Thread");                       //主線程完成標記
            Console.WriteLine(await t);                             //await 主線程等待取異步返回結果
        }
        static async Task<string> TestAsync()
        {
            return await Task.Run(() =>
            {
                Thread.Sleep(1000);                                 //異步執行一些任務
                return "Hello World";                               //異步執行完成標記
            });
        }
        #endregion

        #region task
        public static void TaskRun()
        {
            Console.WriteLine("執行GetReturnResult方法前的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
            var strRes = Task.Run<string>(() => { return GetReturnResult1(); });
            Console.WriteLine("執行GetReturnResult方法後的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
            Console.WriteLine("我是主線程,線程ID:" + Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(strRes.Result);
            Console.WriteLine("獲得結果後的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));

            Console.ReadLine();

        }

        static string GetReturnResult1()
        {
            Console.WriteLine("我是GetReturnResult裏面的線程,線程ID:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            return "我是返回值";
        }
        #endregion

        #region AwaitTaskRun
        /*
         * await:只能標記在async方法或Task對象前面;等待異步的執行結果。
         * async:標記異步方法,裏面有異步執行則異步,沒有則爲普通方法,只能返回void、Task、Task<T>
         */

        public static void AwaitTaskRun()
        {
            Console.WriteLine("我是主線程,線程ID:{0}", Thread.CurrentThread.ManagedThreadId);
            TestAsync1();
            Console.ReadLine();
        }
        static async void TestAsync1()
        {
            Console.WriteLine("調用GetReturnResult()以前,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
            var name = GetReturnResult();
            Console.WriteLine("調用GetReturnResult()以後,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
            Console.WriteLine("獲得GetReturnResult()方法的結果:{0}。當前時間:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));

            Console.WriteLine("最後執行,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
        }

        static async Task<string> GetReturnResult()
        {
            Console.WriteLine("執行Task.Run以前, 線程ID:{0}", Thread.CurrentThread.ManagedThreadId);
            return await Task.Run(() =>
            {
                Thread.Sleep(3000);
                Console.WriteLine("GetReturnResult()方法裏面線程ID: {0}", Thread.CurrentThread.ManagedThreadId);
                return "我是返回值";
            });
        } 

        #endregion
    }
}

 

須要等待結果執行,必須全部的方法用await,調用方法的時候也須要。異步

相關文章
相關標籤/搜索