如何检查基础异步Task.Result结果是否为空

问题描述 投票:-1回答:2

背景

当前,我有一个.NET Core 3.1 WebAPI方法,该方法正在与SOAP服务异步通信。当我运行任务并获得响应时,它通常可以正常工作,但有时SOAP服务会发送200 Ok()且响应为空。这对我造成了严重破坏。如何检查基础Result / GetSomeFancyDataResult为空?

因为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和互连网,但是还没有找到如何正确检查null的方法。帮助?

c# .net async-await task-parallel-library
2个回答
2
投票

考虑一下等待结果,然后检查返回的值。

// 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);

1
投票

这对我来说最终是最干净的,谢谢大家的帮助,但没有投票!

替代答案

使用@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;
© www.soinside.com 2019 - 2024. All rights reserved.