Есть способ сделать это, но вы потеряете преимущества async-await.
Одна из причин async-await состоит в том, что если ваш поток должен ждать другого процессачтобы завершить, например, чтение или запись на жесткий диск, запрос к базе данных или извлечение некоторой информации из Интернета, ваш поток может сделать некоторые другие полезные вещи, вместо того, чтобы просто ждать, пока этот другой процесс завершится.
Это делается с помощью ключевого слова await.Как только ваша нить видит ожидание.Нить на самом деле не ждет без дела.Вместо этого он запоминает контекст (думает о значениях переменных, частях стека вызовов и т. Д.) И поднимается вверх по стеку вызовов, чтобы увидеть, не ожидает ли вызывающая сторона.Если нет, он начинает выполнять эти операторы, пока не увидит ожидание.Он снова поднимается в стеке вызовов, чтобы увидеть, не ожидает ли вызывающая сторона и т. Д.
Как только этот другой процесс завершает поток (или, возможно, другой поток из пула потоков, который действует так, как если бы он был исходным потоком)) продолжает операторы после ожидания до тех пор, пока процедура не завершится или пока не увидит другое ожидание.
Чтобы сделать это, ваша процедура должна знать, что когда она видит ожидание, контекст долженбыть сохранены и поток должен действовать как описано выше.Вот почему вы объявляете метод async.
Именно поэтому типичные асинхронные функции - это функции, которые предписывают другим процессам выполнять что-то длительное: доступ к диску, доступ к базе данных, связь через Интернет.Это типичные функции, где вы найдете ReadAsync / WriteAsync, рядом со стандартными функциями чтения / записи.Вы также найдете их в классах, которые обычно предназначены для вызова этих процессов, таких как StreamReaders, TextWriters и т. Д.
Если у вас есть неасинхронный класс, который вызывает асинхронную функцию и ожидает до завершения асинхронной функции довозвращение останавливает ожидание вызова стека, чтобы увидеть, если звонящий не ждет: ваша программа действует так, как будто она не использует async-await.
Почти!
Если вы запускаете ожидаемое задание, не дожидаясь его завершения, и делаете что-то еще до того, как дождетесь результата, тогда вместо этого ожидания выполняется другое.что бы поток сделал, если бы вы использовали не асинхронную версию.
Как вызвать асинхронную функцию из неасинхронной функции
ICollection<string> ReadData(...)
{
// call the async function, don't await yet, you'll have far more interesting things to do
var taskReadLines = myReader.ReadLinesAsync(...);
DoSomethingInteresting();
// now you need the data from the read task.
// However, because this method is not async, you can't await.
// This Wait will really be an idle wait.
taskReadLines.Wait();
ICollection<string> readLines= taskRead.Result;
return readLines();
}
Ваши абоненты не получат выгоды отasync-await, однако ваша ветка сможет сделать что-то интересное, пока строки еще не прочитаны.