C# 从异步调用void sync方法-无法等待void
我正在为WebApi实现ExceptionLogger,将异常记录到数据库中C# 从异步调用void sync方法-无法等待void,c#,asynchronous,asp.net-web-api2,C#,Asynchronous,Asp.net Web Api2,我正在为WebApi实现ExceptionLogger,将异常记录到数据库中 public class CustomExceptionLogger : ExceptionLogger { public override async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken) { var log = new Logger(); aw
public class CustomExceptionLogger : ExceptionLogger
{
public override async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)
{
var log = new Logger();
await log.LogMessage(context.Exception); --Cannot await 'void' complie time error here
}
}
public class Logger
{
public void LogMessage(Exception ex)
{
//code to insert message into db
}
}
如何修复此问题?如果您确实希望LogMessage()异步且可等待,则需要更改代码,使其看起来像这样:
public class Logger
{
public async Task LogMessage(Exception ex)
{
//code to insert message into db
}
}
要使其发挥任何作用,您的数据库插入代码也应该是异步的。为什么需要
LogAsync
异步?wait Task.Run(()=>log.LogMessage(context.Exception))
?@Yacoub-Massad-因为我的日志消息涉及数据库操作,所以我希望我的日志异步当前LogMessage
是同步的。即使它涉及数据库操作,它们也是同步操作。如果你真的想让这些方法异步,你需要一直这样做。也就是说,您需要使数据库操作本身异步。@coder:如果您采用相反的方法,您会发现async
adoption效果最好。也就是说,首先让您的“叶子”调用异步API和wait
它们,然后让包含方法async
和wait
它们,等等。如果数据库操作不是异步完成的,使用任务包装同步代码有什么好处?运行然后等待它?您的编辑并不能解决问题。您仍在使用任务包装同步代码。请运行。看看这个:嗯,没错。实际上,如果一直到db插入都不是异步的,那么这一切都没有意义。可能最好只是删除任务。运行bit以消除混淆