Как я могу прочитать возвращаемое значение из асинхронного метода в C #? - PullRequest
0 голосов
/ 14 ноября 2018

Мой 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: невозможно присвоить void неявно типизированной переменной

Из ошибки я понимаю, что это неправильный способ вызова async метода. Но мне нужно прочитать готовый список объектов из async извлеченных данных. Его запрос-ответ, нет реального стабильного потока. Поэтому мне нужно создать этот список только один раз за запрос. Я использую gRPC framework для вызовов RPC.

Пожалуйста, помогите мне получить эти данные и подготовить к использованию.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Метод 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;
}
0 голосов
/ 14 ноября 2018

Просто используйте await при вызове вашего метода

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