[英]Is it possible to return a pointer to an IAsyncEnumerable in an async method?
我有一個異步方法,它使用傳遞給它的委托 function 處理數據讀取器。 委托的目的是從閱讀器中構造域對象並將其返回給調用者。 我想要一個構造委托和讀取器的中間方法,並從被調用的方法返回結果 IAsyncEnumerable。 我能夠做到這一點的唯一方法是實際使用 IAsyncEnumerable 並從中間方法產生這些結果。 嘗試直接返回會導致編譯器錯誤,指出我必須使用 yield return 或 yield break。
delegate T ProcessFunc<T>(MySqlDataReader reader);
async IAsyncEnumerable<T> ProcessReader<T>(MySqlDataReader reader, ProcessFunc<T> transformFunc)
{
while (await reader.ReadAsync() != false)
{
yield return transformFunc(reader);
}
await reader.DisposeAsync();
}
public async IAsyncEnumerable<DataObject> GetDataObjectsAsync()
{
ProcessFunc<DataObject> processFunc = (reader) =>
{
var id = reader.GetGuid( "id" );
return new DataObject(id);
};
var reader = await GetDataObjectsReaderAsync(); //Constructs appropriate sqlcommand and returns a mysqldatareader
//only way i can get this to function
//would like to just be able to write: return ProcessReader(reader, processFunc)
//so as not to chain another enumerable
await foreach (var obj in ProcessReader( reader, processFunc ))
yield return obj;
}
在這種情況下,您可以將ProcessReader
更改為接受Task<MySqlDataReader>
而不是MySqlDataReader
,這樣您就可以使GetDataObjectsAsync
同步:
async IAsyncEnumerable<T> ProcessReader<T>(Task<MySqlDataReader> readerTask, ProcessFunc<T> transformFunc)
{
var reader = await readerTask;
while (await reader.ReadAsync() != false)
{
yield return transformFunc(reader);
}
await reader.DisposeAsync();
}
public IAsyncEnumerable<DataObject> GetDataObjects()
{
ProcessFunc<DataObject> processFunc = (reader) =>
{
var id = reader.GetGuid( "id" );
return new DataObject(id);
};
return ProcessReader(GetDataObjectsReaderAsync(), processFunc)
}
或更改您的GetDataObjectsAsync
方法以返回Task<IAsyncEnumerable<DataObject>>
:
public async Task<IAsyncEnumerable<DataObject>> GetDataObjectsAsync()
{
ProcessFunc<DataObject> processFunc = (reader) =>
{
var id = reader.GetGuid( "id" );
return new DataObject(id);
};
var reader = await GetDataObjectsReaderAsync(); //Constructs appropriate sqlcommand and returns a mysqldatareader
return ProcessReader(reader, processFunc);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.