首页 > 解决方案 > 如何检查底层异步 Task.Result 结果是否为空

问题描述

背景

目前我有一个与 SOAP 服务异步通信的 .NET Core 3.1 WebAPI 方法。当我运行我的任务并获得响应时,它通常可以工作,但有时 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#.netasync-awaittask-parallel-library

解决方案


考虑只等待结果并对返回的值执行检查。

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

推荐阅读