学习。。
首先我们写个例子:
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);
});
}