best practice для асинхронного/ждать, чтобы использовать асинхра «весь путь вниз» (если вы и в самом деле не волнуете, о method1 ждут Method2 завершить).
Можно смешать Task.Wait (или подобные конструкции) с асинхронным кодом, но это bad idea, потому что это может привести к взаимоблокировкам.
Самое лучшее, что здесь будет, как и другие показали, просто сделать method1 асинхронной тоже:
public async Task Method1() {
while (statement1) {
await Method2(i);
// ...
}
Обратите внимание, что вы должны сделать Method1 вернуть задачу тоже, потому что в противном случае вы не можете ждать его :
public async Task Method2
Это может быть случай XY Problem хотя бы потому, что нет никаких оснований для образца кода вы предоставляете быть асинхронной в первую очередь (или даже отдельный метод, если на то пошло) - вы можете просто сделать Thread.Sleep вместо этого. Кроме того, оператор «if» бессмыслен, потому что, основываясь на том, что вы показали нам, вы задерживаетесь на 2 секунды в любом случае. Было бы полезно, если бы вы могли показать более существенный образец кода, чтобы мы могли лучше понять, что вы пытаетесь сделать, поэтому мы можем порекомендовать, является ли асинхронным решение даже подходящим решением здесь.
Последний вопрос: одна из целей async/await - разрешить вызывающему потоку выполнять другую работу, пока он ждет результата - например, если вы хотите загрузить файл без «висячего» интерфейса. Я видел множество случаев, когда люди используют async/await таким образом, который, по сути, устраняет цель. Например:
static void Main(string[] args) {
// This is a terrible thing to do but it's for illustration purposes
Task task = Method1();
task.Wait();
// Some other work
}
private static async Task Method1() {
await Method2();
// Some other work
}
private static async Task Method2() {
await Method3();
// Some other work
}
private static async Task Method3() {
await Task.Delay(1000);
}
Это довольно немая иллюстрация, как должное, но в этом случае асинхронного/Await совершенно бессмысленно, потому что он просто делает каждое действие последовательно в любом случае.
a) Должен ли метод Method1 дождаться завершения метода Method2 до его продолжения?б) Можете ли вы также сделать асинхронный метод1? c) Не используйте async void, используйте async Задайте – EJoshuaS
Пожалуйста, опубликуйте [MCVE] - «Method2 изменяет в то время как в то время как утверждения Method1 в конце концов» недостаточно, чтобы увидеть, что происходит. –
'async' не означает« выполнить в фоновом режиме ». Это означает «дайте мне обещание выполнить это позже, чтобы я мог« ждать »(и делать некоторые другие вещи). В зависимости от того, что именно вы пытаетесь достичь, возможны несколько подходов к переписыванию. Зачем начинать с асинхронного метода Method2? –