Как проверить лежащий в основе asyn c Task.Result результат для нуля - PullRequest
0 голосов
/ 06 марта 2020

Фон

В настоящее время у меня есть метод. NET Core 3.1 WebAPI, который асинхронно взаимодействует со службой SOAP. Когда я запускаю свою задачу и получаю ответ, она обычно работает, но иногда служба SOAP отправляет 200 Ok () с пустым ответом. Это сеет хао c для меня. Как я могу проверить, что базовый Result / GetSomeFancyDataResult имеет значение null?

Поскольку GetSomeFancyDataResult является результатом в «Результате», я получаю действительный «Результат», но «GetSomeFancyDataResult» является нулевым, и когда я пытаюсь проверить его на нулевое значение, я получаю ошибку, что это не создан.

Пример кода

    // make an async request to legacy SOAP service
    var client = new mySoapService.serviceClient();
    var request = new mySoapService.GetSomeFancyDataRequest(1, "abc", 234);
    var task = Task.Run(async () => await client.GetSomeFancyDataAsync(request));

    // how to check if GetSomeFancyDataResult exists ?
    if (task.Result.Equals(null) || task.Result.GetSomeFancyDataResult.Equals(null))
        return null; // exit here, abort!

    // process the results when data is found in the result ??
    var results = task.Result.GetSomeFancyData.Select(result => result.MyFancyFieldOne);

Моя проблема

Моя проблема в том, что это не работает должным образом ...

// how to check if GetSomeFancyDataResult exists ?
if (task.Result.Equals(null) || task.Result.GetSomeFancyDataResult.Equals(null))
    return null; // exit here, abort!

Может быть, я смотрел на это слишком долго. Что я здесь пропускаю? Я искал SO и interwebs и не нашел, как проверить это для нуля правильно. Помощь

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Рассмотрим просто ожидание результата и выполните проверку возвращаемого значения.

// make an async request to legacy SOAP service
var client = new mySoapService.serviceClient();
var request = new mySoapService.GetSomeFancyDataRequest(1, "abc", 234);
var result = await client.GetSomeFancyDataAsync(request);

//check if GetSomeFancyDataResult exists
if (result == null || result.GetSomeFancyDataResult == null)
    return null; // exit here, abort!

// process the results when data is found in the result ??
var results = result.GetSomeFancyData.Select(x => x.MyFancyFieldOne);
0 голосов
/ 06 марта 2020

Использование предложения @Matt Johnson-Pint работает для меня наиболее чисто.

// make an async request to legacy SOAP service
var client = new mySoapService.serviceClient();
var request = new mySoapService.GetSomeFancyDataRequest(1, "abc", 234);
var task = Task.Run(async () => await client.GetSomeFancyDataAsync(request));

// process the results when data is found in the result ??
var results = task.Result?.GetSomeFancyData?.Select(result => result.MyFancyFieldOne);

if (results == null)
    return null;

return results;
...