2016-05-19 2 views
2

Я реализую ExceptionLogger для WebApi, где исключения записываются в базу данных.вызов метода void sync из Async - не может ждать 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

'ждут Task.Run (() => log.LogMessage (context.Exception))'? –

+0

@Yacoub Massad - Поскольку моя запись связана с операцией базы данных, я хочу, чтобы мой LogAsync был асинхронным. – user472269

ответ

2

Если вы действительно хотите СообщениеЖурнала(), чтобы быть асинхронной и 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/ –

Смежные вопросы