在等待任务完成之前返回的函数

吉米·阿尔杰

这段代码中 async-await 操作的顺序有点偏离。await里面任务DownloadMetasBySortAsync不像我想象的那样表现。任务自行完成,但只有在DownloadMetasBySortAsync已经返回null到 之后DownloadMetasAsync

我已经尝试添加Task.Wait()中的任务DownloadMetasAsync 令人反感的、等待的任务。我试过了ConfigureAwait()DownloadMetasBySortAsync总是null在所需的任务完成之前退回

我错过了什么?

public async Task<List<MyMeta>> DownloadMetasAsync(SortType sortType)
{
    ResetFlags();
    _cloudMetas = await DownloadMetasBySortAsync(sortType);
    Debug.Log((_cloudMetas != null) ? _cloudMetas.Count + " metas downloaded" : "NULL cloudmetas");
    return _cloudMetas;
}

private async Task<List<MyMeta>> DownloadMetasBySortAsync(SortType sortType)
{
    //Load Table
    Table dbTable = null;
    //Can't call LoadTable from main thread
    await Task.Run(() => { 
        try {
            dbTable = Table.LoadTable(DBClient, new TableConfig(_databaseName));
        }catch( Exception ex ) {
            _operationFailed = true;
            ThrowError(ex);
        }
    });
    if(dbTable == null ) { return null; }

    //Set up secondary local index if needed
    string sortIndex = (sortType == SortType.Creator) ? "date-creator-index" : null;

    return await ScanTable(_dbName, sortIndex); //Scan table for list of metas
}

private async Task<List<MyMeta>> ScanTable(string dbName, string index)
{
    List<MyMeta> metaList = null;
    try {
        Dictionary<string,AttributeValue> lastKeyEvaluated = null;

        do {
            var request = new ScanRequest
            {
                TableName = dbName,
                IndexName = index,
                ConsistentRead = true,
                ExclusiveStartKey = lastKeyEvaluated
            };
            Debug.Log("Scanning...");
            await Task.Run(() =>
            {
                DBClient.ScanAsync(request, (responseObj) =>
                {
                    if( responseObj == null ) {
                        Debug.LogWarning("Response NULL");
                    }
                    else {
                        Debug.Log("Response received");
                        if(metaList == null ) { metaList = new List<MyMeta>(); }
                        var resultList = ProcessScanResult(responseObj.Response);
                        if( resultList != null && resultList.Count > 0 ) {
                            metaList.AddRange(resultList);
                        }
                    }
                    lastKeyEvaluated = responseObj.Response.LastEvaluatedKey;
                });
            });

        } while( lastKeyEvaluated != null && lastKeyEvaluated.Count != 0 );
    }
    catch( Exception ex ) {
        ThrowError(ex);
    }

    return metaList;
}
萨米·库莫宁

由于DBClient.ScanAsync不是 async/await 方法而是异步方法的回调类型,因此它会在被调用后立即返回,并且结果只会在稍后出现。要处理此问题,您可以使用TaskCompletionSource将其变成可等待的东西:

var task = new TaskCompletionSource<responseObjType>();

DBClient.ScanAsync(request, (responseObj) =>
{
    task.SetResult(responseObj);
}

// Will wait for the callback to be called before continuing and get the results
var responseObj = await task.Task;

if( responseObj == null )
{
    ...

这样,该方法将等到回调被调用,数据通过TaskCompletionSource对象发回,您的代码可以进一步处理它。这假设您不特别想在回调中运行其余代码,用于线程目的或任何其他目的,并且将返回到主代码流来完成其余的工作。如果需要,您也可以在回调中进行处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

在返回函数变量之前,如何等待诺言完成?

来自分类Dev

如何使函数在完成特定任务之前不返回?

来自分类Dev

从C#中的方法返回之前如何等待所有任务完成

来自分类Dev

等待任务完成后不返回

来自分类Dev

如何在从主函数返回值之前等待委托函数完成

来自分类Dev

从功能返回之前,等待AJAX完成?

来自分类Dev

在返回之前等待 NodeJS 中的事件完成

来自分类Dev

完成处理程序在任务完成之前返回

来自分类Dev

异步函数在返回之前不会等待

来自分类Dev

在异步方法完成之前返回的函数JS

来自分类Dev

函数在代码完成快速运行之前返回

来自分类Dev

React:在获取完成之前返回函数

来自分类Dev

TPL等待任务以特定的返回值完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

任务不等待完成

来自分类Dev

等待异步任务完成

来自分类Dev

任务不等待完成

来自分类Dev

当您等待任务返回之前会发生什么?

来自分类Dev

在返回结果之前,nodejs不等待异步功能完成

来自分类Dev

在返回值之前,如何等待回调完成?

来自分类Dev

在返回值之前等待异步“findOne”完成

来自分类Dev

函数之前没有等待功能的完成吗?

来自分类Dev

异步等待返回任务

来自分类Dev

等待任务返回WaitingForActivation?

来自分类Dev

服务调用在完成执行之前返回了错误的网关-未等待Nodemailer完成

来自分类Dev

任务不等待ContinueWith完成

来自分类Dev

等待所有任务完成

来自分类Dev

Android:等待多个任务完成