2017-02-15 3 views
5

Скажу, у меня есть метод, который вызывает другой метод асинхронного сразу или аналогичный:Действительно ли для асинхронного метода сквозного доступа нужен шаблон ожидания/асинхронизации?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

Есть ли конкретная причина, что Foo2 потребность/должна иметь асинхронные/Await, в отличие от простого вызова:

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 

В потребителе, это будет по-прежнему ждал, likeso, независимо от того:

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

всех этих заявлений будет компиляции. Будет ли компилятор генерировать разные ИЛ для двух разных методов?

ответ

6

зависит от цели. В частности, поведение исключений отличается от Convert.ToInt32.

У меня есть целый blog post on the subject, но в целом я бы использовал async/await, потому что исключение будет помещено в возвращаемую задачу. В противном случае исключение будет выбрано напрямую.

Исключение исключений только для допустимых условий исключения (т. Е. Это нарушение API для передачи двойного кода, который не может быть преобразован в int). И даже тогда (для исключений предварительных условий) вы можете либо бросить исключения напрямую, либо поместить их в возвращаемую задачу.

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