C# 如何检查基础异步任务.Result是否为null 背景
目前,我有一个.NETCore3.1WebAPI方法,它与SOAP服务异步通信。当我运行我的任务并得到一个响应时,它通常是有效的,但有时SOAP服务会发送一个带有空响应的200 Ok()。这对我来说是一场浩劫。如何检查基础结果/GetSomeFancyDataResult是否为null 因为GetSomeFancyDataResult是“result”下的结果,所以我得到一个有效的“result”,但“GetSomeFancyDataResult”为null,当我尝试检查它是否为null时,我得到一个未实例化的错误 示例代码 我的问题 我的问题是,这不符合预期C# 如何检查基础异步任务.Result是否为null 背景,c#,.net,async-await,task-parallel-library,C#,.net,Async Await,Task Parallel Library,目前,我有一个.NETCore3.1WebAPI方法,它与SOAP服务异步通信。当我运行我的任务并得到一个响应时,它通常是有效的,但有时SOAP服务会发送一个带有空响应的200 Ok()。这对我来说是一场浩劫。如何检查基础结果/GetSomeFancyDataResult是否为null 因为GetSomeFancyDataResult是“result”下的结果,所以我得到一个有效的“result”,但“GetSomeFancyDataResult”为null,当我尝试检查它是否为null时,我得
// how to check if GetSomeFancyDataResult exists ?
if (task.Result.Equals(null) || task.Result.GetSomeFancyDataResult.Equals(null))
return null; // exit here, abort!
也许我已经盯着这个看太久了。我在这里俯瞰什么?我已经搜索了SO和interwebs,还没有找到如何正确地检查null。帮助?考虑等待结果并对返回值进行检查
// 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);
考虑等待结果并对返回值执行检查
// 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);
使用@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;
使用@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;
您是否尝试过
if(task.Result==null | |等)
。调用task.Result.Equals(null)
似乎是错误的。如果您查看示例object.Equals
override,它会检查null
,但这似乎不是我所期待的。。。如果task.Result
为null,则task.Result.Equals(null)
应引发null ref异常。是不是你看到的行为不符合预期?@Nkosi:um,不是。如果task.Result
为null,那么task.Result.Equals(null)
(如果If
)中的第一个条件等同于null.Equals(null)
。除非.Equals
被实现为一个扩展方法(我很确定它不是),否则它将throw@AussieJoe-尽量不要气馁。有些人甚至在一个问题写得很好的时候也会投反对票。@AussieJoe请不要破坏你自己的帖子,让它不再是一个包含答案的问题。欢迎您发布答案作为答案。如果您认为应该删除该帖子,您必须标记以引起版主的注意,并解释为什么必须删除该帖子。您是否尝试过If(task.Result==null | |等)
。调用task.Result.Equals(null)
似乎是错误的。如果您查看示例object.Equals
override,它会检查null
,但这似乎不是我所期待的。。。如果task.Result
为null,则task.Result.Equals(null)
应引发null ref异常。是不是你看到的行为不符合预期?@Nkosi:um,不是。如果task.Result
为null,那么task.Result.Equals(null)
(如果If
)中的第一个条件等同于null.Equals(null)
。除非.Equals
被实现为一个扩展方法(我很确定它不是),否则它将throw@AussieJoe-尽量不要气馁。有些人甚至在一个问题写得很好的时候也会投反对票。@AussieJoe请不要破坏你自己的帖子,让它不再是一个包含答案的问题。欢迎您发布答案作为答案。如果你认为这篇文章应该被删除,你就必须提醒版主注意,并解释为什么必须删除。这是有效的。我已经盯着它看了太多太久了。非常感谢。对于空合并运算符也是一个很好的机会if(result?.GetSomeFancyDataResult==null)
或者,假设最后一行应该是相同的属性并且刚刚键入,您可以跳过if并只返回result?.GetSomeDancyDataResult?.Select(result=>result.myFancyFieldDone)代码>@MattJohnson品脱哦,太辣了@恩科西:如果我改变等待时间,这实际上是行不通的。如果我像我的例子中那样保持它,它确实有效。干杯这起作用了。我已经盯着它看了太多太久了。非常感谢。对于空合并运算符也是一个很好的机会if(result?.GetSomeFancyDataResult==null)
或者,假设最后一行应该是相同的属性并且刚刚键入,您可以跳过if并只返回result?.GetSomeDancyDataResult?.Select(result=>result.myFancyFieldDone)代码>@MattJohnson品脱哦,太辣了@恩科西:如果我改变等待时间,这实际上是行不通的。如果我像我的例子中那样保持它,它确实有效。干杯