【问题标题】:How to check an underlying async Task.Result result for null如何检查底层异步 Task.Result 结果是否为空
【发布时间】:2020-03-05 23:56:26
【问题描述】:

背景

目前我有一个与 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。帮忙?

【问题讨论】:

  • 你试过if (task.Result == null || etc.)。调用task.Result.Equals(null) 似乎是错误的。如果您查看示例object.Equals 覆盖此处docs.microsoft.com/en-us/dotnet/api/…,它会检查null,但这似乎不是我所指望的
  • 等一下...如果task.Result 为空,那么task.Result.Equals(null) 应该抛出一个空引用异常。您看到的是 没有按预期工作 行为吗?
  • @Nkosi:嗯,不。如果task.Result 为空,则task.Result.Equals(null)if 中的第一个条件)等价于null.Equals(null)。除非.Equals 被实现为扩展方法(我很确定它不是),否则会抛出
  • @AussieJoe - 不要气馁。即使问题写得很好,有些人也会投反对票。
  • @AussieJoe 请不要破坏您自己的帖子,通过包含答案使其不再是问题。欢迎您发布答案作为答案。如果您认为该帖子应该被删除,您必须标记以引起版主注意并解释为什么必须删除它。

标签: c# .net async-await task-parallel-library


【解决方案1】:

考虑只是等待结果并检查返回的值。

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

【讨论】:

  • 这行得通。我已经盯着它看得太久太久了。谢谢!
  • 空合并运算符的好机会。 if (result?.GetSomeFancyDataResult == null)
  • 或者,假设最后一行应该是相同的属性并且只是打错了,你可以跳过 if 和 return result?.GetSomeDancyDataResult?.Select(result => result.MyFancyFieldOne);
  • @MattJohnson-Pint 哦,太热了!!
  • @Nkosi 实际上,如果我更改等待,这将不起作用。如果我像我的例子一样保持它,它确实有效。干杯!
【解决方案2】:

使用@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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 2014-04-13
    • 2020-04-09
    • 2013-07-24
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多