2016-05-19 313 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/ –

相關問題