C# async await的使用


async 聲明一個包含異步代碼的函數,該函數執行時不會阻塞調用線程。

async標記的函數返回值必須為 void ,Task,Task<TResult>

await 必須修飾Task 或者Task<TResult>

await之后的代碼運行線程:對於純console工程,還是耗時任務的線程,

對於winform線程,則是調用線程。

 

典型代碼

 

        public static async Task<int> CalAsync()
        {
            string tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置async函數,await之前,線程ID"+tid);
            int result = await Task.Run(new Func<int>(Cal));
            tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置async函數,await之后,線程ID" + tid);
            return result;
        }

全部代碼

class Program
    {
        static void Main(string[] args)
        {
            string tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置主函數,調用async異步之前,線程ID"+tid);
            Task<int> t = CalAsync();
            Console.WriteLine("當前位置主函數,調用async異步之后,線程ID" + tid);
            Console.Read();

        }
        public static async Task<int> CalAsync()
        {
            string tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置async函數,await之前,線程ID"+tid);
            int result = await Task.Run(new Func<int>(Cal));
            tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置async函數,await之后,線程ID" + tid);
            return result;
        }

        public static int Cal()
        {
            string tid = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine("當前位置耗時函數,線程ID"+tid);
            int sum = 0;
            for (int i = 0; i < 999; i++)
            {
                sum = sum + i;
            }
            Console.WriteLine("當前位置耗時函數完成,線程ID" + tid);
            return sum;
        }


    }
View Code

輸入內容

 

 

winform中優雅的實現

private async void button1_Click(object sender, EventArgs e)
        {
            var t = Task.Run(() =>
            {
                Thread.Sleep(5000);
                return "Returning from TimeConsuming task";
            });
            this.Text = await t;
        }

 

 

參考

https://www.cnblogs.com/doforfuture/p/6293926.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM