有的时候,我们可能会发现有些异步方法没有关键字async,程序同样能够正常运行。
了解这个之前,我们需要知道async函数的缺点;
- 异步方法是一个类(具体需要通过反编译工具看源代码),运行效率没有普通方法高。因为类的创建包含其他成员属性的声明,会消耗很多额外的资源。
- 可能会占用非常多的线程。
了解到以后特点后,在某些情况下,我们可以省略掉async关键字。
class Program
{
static async Task Main(string[] args)
{
string s = await ReadAsync(1);
Console.WriteLine(s);
}
static Task<string> ReadAsync(int num)
{
if (num == 1)
{
return File.ReadAllTextAsync(@"D:\Test\1.txt");
}
else if (num == 1)
{
return File.ReadAllTextAsync(@"D:\Test\1.txt");
}
else
{
throw new ArgumentException();
}
}
}
在上例中,ReadAsync()函数没有关键字async,同样没有问题。该函数体的File.ReadAllTextAsync()前省略了await关键字,函数同样没有async关键字。
此种情况只能应用于异步函数没有其他额外的业务逻辑时,只是简单的讲异步的返回值返回给调用者。
类似于下面这种:
通过上图可以看出,如果增加了额外的业务逻辑,程序是会报错的。