Подтвердить что ты не робот

Шаблон обработки async/await

У меня есть следующий повторяющийся шаблон try/catch в моем коде. Использование блока try/catch для обработки любых исключений, возникающих при вызове метода в orionProxy.

async private void doGetContacts()
{
    try {
        currentContacts = await orionProxy.GetContacts (); // call method in orionProxy
        ShowContacts (); // do something after task is complete
    }
    catch (Exception e) {
        orionProxy.HandleException (e); // handle thrown exception
    }
}

Что я хотел бы написать, это примерно следующее.

async private void doGetContacts()
{
    currentContacts = await orionProxy.CheckForException(orionProxy.GetContacts ());
    ShowContacts (); // do something after task is complete but shouldn't run on exception
}

Любые указатели/предложения? Я пробовал различные формы Actions/Tasks/Lambdas, но ничто не приведет к ловушке исключения в orionProxy.CheckForException(?), Поэтому ShowContacts не запускается.

4b9b3361

Ответ 1

Я не понимаю, почему это не сработает, предполагая, что GetContacts - это метод async:

public async Task<T> CheckForExceptionAsync<T>(Task<T> source)
{
  try
  {
    return await source;
  }
  catch (Exception ex)
  {
    HandleException(ex);
    return default(T);
  }
}

На стороне примечания вы должны избегать async void (как я описал в своей статье MSDN) и завершите имена методов async с суффиксом async.