簡體   English   中英

是否可以在異步方法中返回指向 IAsyncEnumerable 的指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM