C# 从异步调用void sync方法-无法等待void

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

我正在为WebApi实现ExceptionLogger,将异常记录到数据库中

 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以消除混淆