Async await в цепочке вызовов
От: milvic  
Дата: 29.04.20 12:10
Оценка:
Всем привет.

Ситуация:

есть asp.net core mvc приложение, в нём async action который асинхронно вызывает метод M класса SBL
public async Task<ActionResult> A([FromBody]T r) {
   var res = await SBL().M(r);
   return res;
}


//сигнатура метода TBL.M примерно такая:
public class TBL {
  // без async await, но здесь логики нет, просто пробрасывается вызов
  public Task<D> M(T r) {
    return DBL().M(r);
  }
}


//сигнатура метода DBL.M примерно такая:
public class DBL {
  public async Task<N> M (T r) {
     // тут какая-то сложная логика
     return {что-то};
  }
}


т.е. async метод, вызывает не async метод который вызывает async метод.
насколько это легально, такой подход имеет место быть?
Отредактировано 29.04.2020 12:10 milvic . Предыдущая версия .
Re: Async await в цепочке вызовов
От: Слава  
Дата: 29.04.20 12:13
Оценка:
Здравствуйте, milvic, Вы писали:

M>насколько это легально, такой подход имеет место быть?


Полагаю, что здесь всё нормально, если в цепочке вызовов не встречается чего-то вроде task.GetResult() без await.
Re: Async await в цепочке вызовов
От: SuhanovSergey  
Дата: 30.04.20 12:52
Оценка:
Здравствуйте, milvic, Вы писали:

M>Всем привет.


M>Ситуация:


M>есть asp.net core mvc приложение, в нём async action который асинхронно вызывает метод M класса SBL

M>
M>public async Task<ActionResult> A([FromBody]T r) {
M>   var res = await SBL().M(r);
M>   return res;
M>}
M>


M>//сигнатура метода TBL.M примерно такая:

M>
M>public class TBL {
M>  // без async await, но здесь логики нет, просто пробрасывается вызов
M>  public Task<D> M(T r) {
M>    return DBL().M(r);
M>  }
M>}
M>


M>//сигнатура метода DBL.M примерно такая:

M>
M>public class DBL {
M>  public async Task<N> M (T r) {
M>     // тут какая-то сложная логика
M>     return {что-то};
M>  }
M>}
M>


M>т.е. async метод, вызывает не async метод который вызывает async метод.

M>насколько это легально, такой подход имеет место быть?

Тут все ок.
Надо понимать, что async — это деталь реализации. Для вызывающего TBL.M лишь важно, что метод DBL.M возвращает Task, который TBL может await. Как метод DBL.M получает Task, его дело. Если он хочет вернуть Task, созданный кем-то другим, не проблема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.