C#的async和await

學習。。

首先我們寫個例子:


public class MyClass
    {
        public MyClass()
        {
            //調用該方法不會阻塞  
            ShowValue(); 


            Console.WriteLine("MyClass() End.");
        }
        public Task<int> GetValueAsync(int number1, int number2)
        {
            return Task.Run(() =>
            {
                for (var i = 0; i < 1000000; i++)
                {
                    number1 = number1 + number2;
                }
                return number1;
            });
        }


        public async void ShowValue()
        {
            //此處會開新線程處理GetValueAsync任務,然後方法馬上返回  
            double result = await GetValueAsync(2143, 55);


            //這之後的所有代碼都會被封裝成委託,在GetValueAsync任務完成時調用  
            Console.WriteLine("Value is : " + result);
        }


        #region 其他實例
        ///異步打印傳入的字符串
        public async static Task<string> AsyncAdd(string str)
        {
            string result = await PringString(str);
            return result;
        }
        public async static Task<string> PringString(string str)
        {
            return "Hello World" + str;
        }
        #endregion
    } 


上面在MyClass的構造函數裏調用了async關鍵字標記的異步方法DisplayValue(),DisplayValue()方法裏執行了一個await關鍵字標記的異步任務GetValueAsync(),這個異步任務必須是以Task或者Task<TResult>作爲返回值的,而我們也看到,異步任務執行完成時實際返回的類型是void或者TResult,DisplayValue()方法裏await GetValueAsync()之後的所有代碼都會在異步任務完成時纔會執行。


DisplayValue()方法實際執行的代碼如下:

public void DisplayValue()  
{  
    System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();  
    awaiter.OnCompleted(() =>  
        {  
            double result = awaiter.GetResult();  
            System.Diagnostics.Debug.WriteLine("Value is : " + result);  
        });  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章