學習。。
首先我們寫個例子:
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()方法實際執行的代碼如下:
{
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);
});
}