2017-02-05 4 views
0

Я создал библиотеку протоколирования, а метод журнала возвращает номер ошибки (PK) при внесении записи в БД, который я уведомляю пользователей как часть сообщения об ошибке на их UI. Они также используют этот ключ в качестве справочного материала, когда говорят в команде поддержки.Использование метода библиотеки Async в неасинхронных методах

И у меня есть метод асинхронной для делать то же самое, как показано ниже:

public class Logger 
{ 
    public async Task<string> LogAsync(Exception ex) 
    { 
    return await DoLogAsync(ex); 
    } 

    // some private method, with multiple optional parameters 
    private Task<string> DoLogAsync(Exception ex) 
    { 
    return Task.Run(() => Log(ex)); 
    } 
} 

Примечание: Я признаю, это асинхронная версия не что иное, как просто оборачивает синхронный метод, Log(), в задаче .Бег. Я не уверен, что еще нужно сделать!

Теперь я планирую использовать метод выше Log(), во всех моих APIs, как показано ниже:

public Result<MyObject> Get() 
{ 
    var result = new Result<MyObject>(); 

    try 
    { 
    throw new DivideByZeroException(); 
    } 
    catch (DivideByZeroException ex) 
    { 
    string errorId = await _logger.LogAsync(ex); 
    response.AddErrorMessage("Please Contact Admin with this error #"+errorId); 
    } 

    return result; 
} 

Для того, чтобы сделать выше работы, мне нужно сделать метод API асинхр, так как я жду вызова регистратора.

  1. Как я могу избежать изменения асинхронного вызова API, только ради Logger? Каковы другие возможности для выполнения этой работы?
  2. Как вы думаете, LogAsync() действительно было бы полезно? Мой поток пользовательского интерфейса будет ожидать, что номер ошибки будет возвращен в любом случае, так почему бы просто не вызвать метод синхронизации?
  3. Существует несколько методов Log(), которым не требуется номер ошибки, в свою очередь, вид журнала и забыть. Как вы думаете, асинхронные версии будут полезны в таких сценариях, потому что пользовательский интерфейс ничего не ожидает?

Ответ: На вопрос 1, это работает: Waiting for async/await inside a task

Кроме того, для 2 и 3, имеющие реализации ADO.NET большого смысла, а не Task.Run

+0

Является ли это веб-приложение? – JohanP

+0

это C# ... пожалуйста mid теги :) – ymz

+1

C# - это язык. Вы можете использовать C# для приложений ASP.Net, а также для Web API. – JohanP

ответ

0

Если вы 're using Web API я бы не пошел на asyncLog метод, если метод не действительноasync. Посмотрите на this ответ от Стивена Клири.

+0

wow .. поэтому мне не нужно подвергать асинхронному методу; скорее, я бы использовал методы async ADO.Net внутри. спасибо – Skip

+1

Если вы используете ADO.Net в своем приложении для доступа к БД, тогда да, вы должны использовать его методы 'async'. Это означает, что ваш метод 'Log' по-прежнему будет' async' tho, но вам не нужно обертывать его в 'Task.Run' – JohanP

+0

, чтобы получить дополнительную информацию. Да; я могу их успешно использовать – Skip

0

Если вы начинаете использовать подход async-await в своем коде - имейте в виду, что async будет распространяться по всему контуру вашего приложения.

Так

Как следует избегать изменения моего API вызова асинхр, просто ради Logger? Каковы другие возможности для выполнения этой работы?

Ответ: Не используйте async

Как вы думаете, LogAsync() будет действительно полезным? Мой поток пользовательского интерфейса будет ждать, пока номер ошибки будет возвращен, так почему бы не просто вызвать метод синхронизации?

Ответ: Преимуществом является то, что во время ожидания пользовательский интерфейс будет «отзывчивым» - пользователь, например, сможет переместить окно приложения на другой экран или свести его к минимуму.

Существует несколько методов Log(), которые не нуждаются в количестве ошибок, в return, типа log-and-forget. Как вы думаете, асинхронные версии будут полезны в таких сценариях, потому что пользовательский интерфейс ничего не ожидает?

Ответ: такой же, как предыдущий ответ

+0

Thanks; Итак, вместо создания асинхронного API, я хотел бы использовать, как показано ниже, как кто-то предложил в другом сообщении: 'var t = Task.Run (async() => {await lIB.LogAsync();});' Любая сторона влияет на этот подход, вы думаете? – Skip

+0

Побочные эффекты: вы тратите ресурсы, резервируя/создавая другую тему только для того, чтобы ничего не делать. В операции ввода-вывода (какой запрос базы данных) поток будет отправлять запрос и ждать ответа. – Fabio

+0

спасибо; Кажется, мне будет лучше без асинхронного в этом сценарии – Skip