如何从C#中的Async方法读取返回值?

时间:2018-11-14 09:21:35

标签: c# asynchronous async-await grpc

我的async方法如下:

public async Task<List<object>> handleSummaryOfWallets()
{
    string token = giveMeToken("URL AND CREDS");

    Channel channel = new Channel("NANANANA GIROUD", ChannelCredentials.Insecure);

    OMGadminAPI.OMGadminAPIClient client = new OMGadminAPI.OMGadminAPIClient(channel);

    var summaryBalancesParams = new OMGadminAPIGetCurrenciesSummariesParams();

    summaryBalancesParams.AdminAuthTokenSecret = token;
    List<object> summariesCurrenciesOMGadmin = new List<object>();

    using (var call = client.GetCurrenciesSummaries(summaryBalancesParams))
    {
        while (await call.ResponseStream.MoveNext())
        {
            OMGadminAPICurrencySummary currencySummary = call.ResponseStream.Current;
            summariesCurrenciesOMGadmin.Add(currencySummary);
            Console.WriteLine(summariesCurrenciesOMGadmin);
        }
        return summariesCurrenciesOMGadmin;
    }
}

如您所见,以上async方法将返回对象列表。我将这种方法称为:

var listOfBalances = balances.handleSummaryOfWallets().Wait();

它给了我错误:

  

错误CS0815:无法将空赋给隐式类型的变量

从该错误中,我知道这不是调用async方法的正确方法。但是我需要从async获取的数据中读取对象的就绪列表。它的请求-响应,没有真正稳定的流。因此,每个请求只需要生成一次此列表。我正在使用 gRPC 框架进行RPC调用。

请帮助我获取此数据并准备使用。

2 个答案:

答案 0 :(得分:3)

在调用方法时只需使用await

var listOfBalances = await balances.handleSummaryOfWallets();

答案 1 :(得分:3)

Task.Wait方法等待Task完成执行。它返回void。这就是例外的原因。

现在要克服异常并读取返回值,一种方法是在其他答案和注释中提到的; await通话如下:

public async void TestAsync()
{
    var listOfBalances = await handleSummaryOfWallets();
}

请注意,您的调用方法现在也应该是async方法。

当您在代码中调用Wait时,看起来您立即想要结果;您别无选择,不依赖结果。在这种情况下,您可以选择通过调用async来停止Wait链。但是您需要进行如下更改:

public void TestAsync()
{
    var task = handleSummaryOfWallets();//Just call the method which will return the Task<List<object>>.
    task.Wait();//Call Wait on the task. This will hold the execution until complete execution is done.
    var listOfBalances = task.Result;//Task is executed completely. Read the result.
}

请注意,调用方法不再是async。其他注释在代码注释中给出。

上述代码的其他简短替代方法如下:

public void TestAsync()
{
    var listOfBalances = handleSummaryOfWallets().Result;
}