2016-05-19 310 views
2

我正在为WebApi实现ExceptionLogger,其中异常会记录到数据库中。从Async调用void同步方法 - 无法等待void

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 
    } 
} 

如何解决这个问题?

+0

为什么你需要'LogAsync'是异步? –

+2

'await Task.Run(()=> log.LogMessage(context.Exception))'? –

+0

@Yacoub Massad - 由于我的logmessage涉及数据库操作,我希望我的LogAsync是异步 – user472269

回答

2

如果你真的想要的LogMessage()是异步和awaitable,你需要改变你的代码看起来是这样的:

public class Logger 
{ 
    public async Task LogMessage(Exception ex) 
    { 
    //code to insert message into db 
    } 
} 

对于它有什么用处,你的数据库插入代码应也是异步的。

+2

如果数据库操作不是异步完成的,那么获得的好处是什么用Task.Run包装同步代码然后等待它? –

+0

好点。 :)编辑。 –

+0

您的编辑无法解决问题。你仍然用'Task.Run'封装同步代码。看看这个:http://www.ben-morris.com/why-you-shouldnt-create-asynchronous-wrappers-with-task-run/ –

相关问题