c#異步--async和await的使用


async/await是C#5.0中推出的

async用來修飾方法,表明這個方法是異步的,聲明的方法的返回類型必須為:void,Task或Task<TResult>。

Task<TResult>就是有返回值的Task,TResult就是返回值類型。比如Task<int>

await必須用來修飾Task或Task<TResult>,而且只能出現在已經用async關鍵字修飾的異步方法中。

通常情況下,async/await成對出現才有意義,

await可以讓主線程等待后台線程執行完畢

await不會阻塞主線程

下面用例子來說明

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Main方法執行開始");
            Run();
            Console.WriteLine("Main方法執行結束");
            Console.Read();
        }

        static async void Run()
        {
            Console.WriteLine("2:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Run方法執行開始");
            await Task.Run(()=> {
               Console.WriteLine("Task.Run方法執行開始");
               Console.WriteLine("3:" +Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10000);
               Console.WriteLine("Task.Run方法執行結束");
            });

            Console.WriteLine("4:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Run方法執行結束");
        }
    }

 

常見錯誤

1 異步方法的返回類型必須為void、Task 或 Task<T>

2 如果一個async修飾的方法沒有Task.run則會保下面警告

警告CS1998  此異步方法缺少 "await" 運算符,將以同步方式運行。請考慮使用"await"運算符等待非阻止的API 調用,或者使用"await Task.Run(...)" 在后台線程上執行占用大量CPU 的工作

總結

1 async方法必須有Task.Run異步方法

2 async方法里面通常由await關鍵字 它用在Task.run前面 作用是告訴主線程 我這邊不用你管了 你繼續執行你自己的。在await之前還是屬於主線程的。還是同步的。

3 await代碼之前是主線程await之后包括Task.Run以及它后面的代碼 都是另外一個線程。


免責聲明!

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



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