异步方法不一定有async,await。
带有async,await的写法,读取文本内容:
/// <summary>
/// 读取txt文本内容 async
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public static async Task<string> ReadAsync(int num)
{
if (num == 1)
{
return await File.ReadAllTextAsync(@"C:\TEMP\1.txt");
}
else if (num == 2)
{
return await File.ReadAllTextAsync(@"C:\TEMP\2.txt");
}
else
{
throw new ArgumentException();
}
}
调用:
static async Task Main(string[] args)
{
string res = await ReadAsync(1);
Console.WriteLine(res);
}
执行结果:
上面的代码实例表示,从1.txt中读取内容,并打印。
没有async,await的写法,读取文本内容:
/// <summary>
/// 读取txt文本内容 没有async await
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public static Task<string> Read1Async(int num)
{
if (num == 1)
{
return File.ReadAllTextAsync(@"C:\TEMP\1.txt");
}
else if (num == 2)
{
return File.ReadAllTextAsync(@"C:\TEMP\2.txt");
}
else
{
throw new ArgumentException();
}
}
调用:
static async Task Main(string[] args)
{
string res = await Read1Async(1);
Console.WriteLine(res);
}
执行结果:
第一种带有async,await的方法会将文件读取的结果转为string,然后放到Task中返回。(多此一举)
第二种没有async,await的方法,会直接将文件读取的结果返回。(效率高)
async方法缺点:
1.异步方法会生成一个类,运行效率没有普通方法高。
2.可能会占用非常多的线程。
总结:
返回值为Task的方法不一定都要标注async,标注async只是为了可以更方便的使用await而已。
如果一个异步方法只是对其他的异步方法调用的转发,没有太多复杂的逻辑(比如等待A的结果,再调用B;把A调用的返回值拿到内部做一些处理再返回),就可以去掉async关键字。