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

Подождите, пока не будет асинхронный метод

Как я могу подождать, когда метод void async завершит работу?

например, у меня есть функция, как показано ниже:

async void LoadBlahBlah()
{
    await blah();
    ...
}

теперь я хочу убедиться, что все загружено, прежде чем продолжить где-то еще.

4b9b3361

Ответ 1

Лучшей практикой является отметка функции async void только в том случае, если это метод огня и забывания, если вы хотите дождаться, вы должны пометить его как async Task.

Если вы все еще хотите дождаться, а затем заверните его так: await Task.Run(() => blah())

Ответ 2

Если вы можете изменить подпись своей функции на async Task, то вы можете использовать представленный код здесь

Ответ 3

Лучшим решением является использование async Task. Вы должны избегать async void по нескольким причинам, одним из которых является возможность сложения.

Если метод не может быть возвращен для возврата Task (например, это обработчик события), вы можете использовать SemaphoreSlim для получения сигнала метода, когда он собирается выйти. Подумайте об этом в блоке finally.

Ответ 4

Вам не нужно ничего делать вручную, await ключевое слово приостанавливает выполнение функции до тех пор, пока blah() не вернется.

private async void SomeFunction()
{
     var x = await LoadBlahBlah(); <- Function is paused
     //do more stuff when LoadBlahBlah() returns
}

private async Task<T> LoadBlahBlah()
{
     return await blah();  <- function is paused
}

T - тип объекта blah() возвращает

Вы действительно не можете await a void, поэтому LoadBlahBlah() не может быть void

Ответ 5

выполните функцию AutoResetEvent, вызовите функцию, затем подождите AutoResetEvent, а затем установите ее в async void, когда вы знаете, что это сделано.

Вы также можете дождаться задания, которое возвращается из вашей арифметики void async