То, как я понимаю, сам смысл написания асинхронного метода состоит в том, чтобы запустить его, а затем двигаться дальше, не дожидаясь его завершения
Тогда почему вы await
the Delay
, если ты в это веришь?Delay
возвращает задачу;Вы начали эту задачу, конечно же, вы хотите двигаться дальше до ее завершения и просто повторить следующую итерацию цикла?
Конечно, нет.Это победило бы всю точку задержки , если бы она работала асинхронно и завершилась, и никто ее не ждал.
Что тогда точно означает await
?Это означает то, что говорится: асинхронно ждать .То есть: этот рабочий процесс не может продолжаться до тех пор, пока эта задача не будет завершена, поэтому, если она не завершена, найдите другую работу и вернитесь позже .
Именно поэтому обычно вызывающий вашего асинхронного метода await
даст результат.Вызывающая сторона вызывает вас асинхронно, потому что они считают, что рабочий процесс может занять некоторое время, и они могут позволить своему вызывающему выполнять больше работы, в то время как они ожидают асинхронного завершения вашего метода.
Это то, что вы бы обычно делали, но ваш метод ненормальный. Ваш метод никогда не завершается нормально! Если бы вы сделали await
этот метод, вы бы подождали, пока он не бросил (потому что он был отменен), пока он не завершится нормально , потому что он не завершается нормально!
Таким образом, await
задачи, возвращаемой вашим методом, на практике, вероятно, будет ждать вечно, а это не то, что вам нужно.
Таким образом, вы можете игнорировать или подавить предупреждение в этом случае.Но в обычном случае вы вызываете метод, потому что вам нужны либо его побочные эффекты, либо его результат , и вы не можете продолжить свой рабочий процесс, пока не получите его.Таким образом, вы await
выполняете задачу, чтобы ваш абонент мог выполнять больше работы, пока вы ожидаете рабочего процесса вашего вызываемого абонента.
Убедитесь, что абсолютно очистите, прежде чем писать больше асинхронного кода.await
- это последовательность операций в асинхронных рабочих процессах. Это означает, что «этот рабочий процесс не будет продолжаться до тех пор, пока эта задача не будет завершена; найдите что-то еще, пока вы ждете, и вернитесь, когда мы сможем продолжить».
Сравните это с "нормальным" вызовом обычного метода.x = foo();
означает «Этот рабочий процесс не будет продолжаться до тех пор, пока не будет завершен вызов foo
; ничего не делайте, только выполните foo
до завершения».Мы так привыкли к тому, что синхронно ожидает результата , что даже не думаем об этом.
Этот вопрос указывает на большую проблему дизайна с типом C #система.Неуниверсальный Task
логически "асинхронный пустота";то есть рабочий процесс завершается , но не завершается со значением . C # не имеет концепции системы типов для методов, которые никогда не возвращаются нормально, но могут выдавать .Вы можете представить себе специальную версию void
, может быть void never
, и в таких методах было бы ошибкой возвращать или иметь достижимую конечную точку.
Ваш рабочий процесс логически "никогда не задается" -- это асинхронный рабочий процесс, который обычно не завершается.Если компилятор знал об этом, он мог бы подавить предупреждение (и он мог выдавать предупреждения при синхронных вызовах never void
методов, у которых после них был недоступный код). Но компилятор не знает этого, потому что это понятиене в системе типов в первую очередь.По логике это может быть, но я думаю, что у команды C # есть более насущные проблемы.