Если бы это был IEnumerable, я бы возвратил IEnumerable.
Ну, вы можете просто сделать то же самое с IAsyncEnumerable
(обратите внимание, что async
удален):
IAsyncEnumerable<string> MyFunction()
{
// ...do some code...
// Return all elements of the whole stream from the enumerator
return MyStringEnumerator();
}
Тем не менее, здесь есть важный смысл c. При вызове метода перечислителя ...do some code...
будет выполняться немедленно , а не при перечислении перечислителя.
// (calling code)
var enumerator = MyFunction(); // `...do some code...` is executed here
...
await foreach (var s in enumerator) // it's not executed here when getting the first `s`
...
Это верно для обоих синхронных и асинхронные перечислимые числа.
Если вы хотите, чтобы ...do some code...
выполнялся при перечислении перечислителя, тогда вам нужно будет использовать foreach
/ yield
l oop, чтобы получить семантику отложенного выполнения :
async IAsyncEnumerable<string> MyFunction()
{
// ...do some code...
// Return all elements of the whole stream from the enumerator
await foreach(var s in MyStringEnumerator())
yield return s;
}
И вам придется использовать тот же шаблон в синхронном мире, если вы хотите семантику отложенного выполнения с синхронным перечислимым тоже:
IEnumerable<string> ImmediateExecution()
{
// ...do some code...
// Return all elements of the whole stream from the enumerator
return MyStringEnumerator();
}
IEnumerable<string> DeferredExecution()
{
// ...do some code...
// Return all elements of the whole stream from the enumerator
foreach(var s in MyStringEnumerator())
yield return s;
}