C# 异步方法是处理高并发和 I/O 等待的关键技术。在 C# 5.0 中,引入了 async 和 await 关键字,它们使得编写异步代码变得更加容易和直观。在异步编程模型中,异步方法可以返回 void 或 Task 对象,这取决于该方法所需的明确或隐含异步调用方案。
1. 返回 void
1.1 概述
返回 void 的异步方法表示这是一个 fire-and-forget 操作,我们不关心结果或该操作是否成功完成。例如,异步写入日志或发送电子邮件。此操作仅需要开始运行且不需要等待其完成。
1.2 示例代码
public async void WriteLog(string message)
{
await Task.Run(() => {
// 模拟写入日志的操作
File.AppendAllText("log.txt", message);
});
}
上面的代码中,WriteLog 方法异步执行,它使用 Task.Run 方法来模拟一个 CPU 密集型操作或 I/O 操作,它会异步将消息写入到日志文件。因为我们不关心结果,所以返回 void 就足够了。
1.3 优点与缺点
优点:返回 void 的异步操作非常简单,仅需异步开启一个任务即可。
缺点:返回 void 的异步操作通常不能轻易取消,也无法处理异常或错误情况。
2. 返回 Task
2.1 概述
返回 Task 对象的异步方法表示使用了异步编程模型,会返回一个表示操作完成的 Task。该 Task 对象可以用于等待异步操作的完成或处理异步操作的异常或错误情况。例如,异步读取文件或查询数据库。
2.2 示例代码
public async Task ReadFile(string path)
{
var result = await Task.Run(() => {
// 模拟从磁盘读取文件的操作
return File.ReadAllText(path);
});
return result;
}
上面的代码中,ReadFile 方法异步执行,它使用 Task.Run 方法来模拟一个 I/O 密集型操作,它会异步读取指定路径上的文件内容并返回结果。
2.3 优点与缺点
优点:返回 Task 对象的异步操作可以很容易地处理错误和异常,例如使用 try-catch 块。此外,该操作可用于等待异步操作的完成,也可以轻松地实现异步操作的取消。
缺点:异步操作支持的实现成本较高,因为您需要自行处理取消和异常处理等问题。此外,在某些情况下,您可能不会立即获得结果。