Я не могу понять, требуется ли утверждение ожидания, когда вызов метода асинхронного вызова является последним вызовом в моем асинхронном методе. Например.выполняет последний асинхронный вызов в асинхронном режиме?
public async Task CallAsync(byte[] data)
{
await Call1Async(data);
Call2Async(data);
}
public async Task Call1Async(byte[] data)
{
...
}
public async Task Call2Async(byte[] data)
{
...
}
Вышеприведенное будет скомпилировано, но с предупреждением «рассмотрите заявку на ожидание этого метода». Но я думаю, что это будет тратить ресурсы на применение, ожидая последнего вызова метода.
В то же время, если я использую return Call2Async(data);
вместо Call2Async(data);
, предупреждение исчезнет. Это означает, что await
на самом деле не требуется в такой ситуации.
Но это работает только для методов, имеющих возвращаемое значение (т. Е. Task<T>
, а не только Task
). Мне нужно это для методов без возвращаемых значений. Есть ли способ сделать то же самое для возвращающих значение методов?
I.e. Мне нужно как-то вернуть Task
объект, возвращенный Call2Async
вызывающему абоненту CallAsync
, и я не могу использовать оператор return
в CallAsync
явно, так как мои методы не имеют возвращаемых значений. Конечно, я могу настроить их все, чтобы вернуть значения (например, true), но это не было бы изящным решением.
P.S. Если у меня есть единственный асинхронный вызов в моем методе, я просто не добавляю «async» к сигнатуре метода, и он работает (оператор «return» не требуется). Но если метод содержит более одного асинхронного вызова, мне нужно иметь модификатор «async», чтобы он мог дождаться первого вызова «Ожидать Call1Async (данные)». И добавление модификатора «async» заставляет компилятор требовать «return», чтобы вернуть объект Task к вызывающему (и это работает только для методов с возвращаемыми значениями). Это то, что я пытаюсь преодолеть.
@dcastro, если вы не сделаете 'CallAsync' ' s type 'Task', вы не можете сделать t hat: либо 1. вы включаете ключевое слово 'async' и можете использовать' await', но в противном случае писать метод, как 'void', или 2. у вас нет' async', нельзя использовать 'await' , а затем верните «Задача» –
@TimS. Спасибо за ответ. Итак, вы подтверждаете, что единственный способ вернуть CallAync к вызывающей стороне ту же задачу, которая возвращается Call2Async, - это сделать все заданные параметры параметрами, например Task, даже если мне не нужно какое-либо возвращаемое значение? –
Alex
@Alex Обычно нет необходимости включать фиктивное значение или возвращать 'Задача' Call2Async'. Я бы порекомендовал вам сохранить их просто 'Задача' и использовать оба' await '. Вы, скорее всего, не хотите возвращать 'Задача' Call2Async', но пусть' async' сгенерирует 'Task', который ждет, пока не будут выполнены оба вызова асинхронного вызова. –