关于日志记录场景,这里有两种场景,async-void 适合第一种,但不太适合第二种。
1) 记录长时间运行的操作的结果:
public static async void LogCompletion(Task operation, string title)
{
try
{
await operation.ConfigureAwait(false);
Log.Info($"{title} completed succesfully");
}
catch (Exception ex)
{
Log.Error($"{title} failed", ex);
}
}
这种用法类似于异步事件处理程序,因为异步操作的完成在概念上类似于引发事件。所以这个方法本质上是“处理”特定任务的完成“事件”。将此 async-void 方法转换为async Task LogCompletionAsync
方法不会带来很多好处。确实,LogCompletion
方法内部的异常会使进程崩溃,但发生异常的唯一可能性是Log.Error
抛出异常。但是,如果您的日志框架开始抛出异常,那么您的应用程序无论如何也不会长期存在。你越早了解它越好,尽快开始寻找更好的日志框架。
2)记录本身:
public static async void Log(string message)
{
try
{
await File.AppendAllTextAsync(GetLogFilePath(),
DateTime.Now.ToString() + " " + message + "\r\n");
}
catch { }
}
这种用法类似于以即发即弃的方式调用异步方法。尽管 async-void 的使用并不可怕,但它是一种非常原始且不复杂的实现日志记录的方式。并且首先尝试实现它是非常不可取的,因为那里有许多免费的高质量实现。