如何检查我正在覆盖的单个异步 C# 任务的布尔返回值? [复制]
Posted
技术标签:
【中文标题】如何检查我正在覆盖的单个异步 C# 任务的布尔返回值? [复制]【英文标题】:How can I check the boolean return value of a single async C# task that I am overriding? [duplicate] 【发布时间】:2021-07-05 23:08:26 【问题描述】:我有这个方法:
private async Task BackArrowTappedHandler()
Task<bool> sp = SavePageDataAsync();
await Task.WhenAll(sp);
var saveResult = sp.Result;
if (!saveResult)
return;
if (Device.RuntimePlatform is Device.ios)
await Navigation.PopModalAsync();
else
await Shell.Current.Navigation.PopAsync();
调用我可能想或不想覆盖的方法:
public virtual async Task<bool> SavePageDataAsync()
return true;
这是一个简短的示例,说明我是如何进行覆盖以使其更清楚:
public async Task<bool> OnSavePageAsync()
var IsValueLess = false;
if (daily < 20)
msg1 = "Minimum words";
msg2 = "Please set a number greater than 20";
IsValueLess = true;
var alertDeckPopup = new AlertPopup(msg2);
await PopupNavigation.Instance.PushAsync(alertDeckPopup);
if (IsValueLess)
return false;
else
return true;
我要做的是检查 SavePageDataAsync 的结果,并根据结果返回或继续。
到目前为止,我唯一的想法是使用 Task.WhenAll
有人可以告诉我是否有更好的方法可以做到这一点,或者如果这是唯一的方法,那么这是进行检查的有效方法吗?
此代码给我一个错误,因为我不知道如何正确调用 SavePageData 然后检查返回值。有人可以给我一些建议吗?
【问题讨论】:
SavePageDataAsync 不使用await
,因此不需要标记async
。省略 async 并返回 Task.FromResult(true)
代替,或者更好地将其标记为抽象,以便继承者必须提供一个实际执行它在锡上所说的实现
我正在做的是在它覆盖使用异步时制作该方法。我还将添加该方法的示例。你能看看我做覆盖的方式,如果你认为它仍然没有正确完成,请告诉我?请注意,如果可能的话,有时不需要保存数据,所以我不想重写该方法,而是希望该方法返回 true。
【参考方案1】:
可以在异步方法上使用await
操作符等待子方法的结果
bool sp = await SavePageDataAsync();
if(sp)
// do action if true
【讨论】:
Caius 暗示我没有正确进行检查。我在问题中添加了更多信息。你能看看,给我你的意见。 如我所见,OnSavePageAsync()
方法的新实现仍然是异步的,因此您仍然可以在封闭方法中使用我的解决方案
感谢 Tibias,我会将您的答案标记为正确。知道为什么我的问题被否决了吗?这是一个糟糕的问题吗?我看到还有其他关于 Async 的建议,但进行了搜索,但没有找到任何我需要的建议。
谢谢!好吧,也许是因为它与async
和await
的主题有点重复。但恕我直言,仍应允许提出个别问题。
我根本不是在暗示你做任何检查不正确 - 我的观察不包含 if
所以它什么都不检查。我指出,就您的代码而言,它会引发警告/错误,例如 “此异步方法缺少 'await' 运算符并将同步运行。”。当你想在其中使用await
时,你可以用async
标记一个方法。 return true
的主体什么也不等待。 在方法内部,移除 await 并返回一个包含布尔值的已完成任务。这与 Tobias 对 await
outside 方法的建议无关以上是关于如何检查我正在覆盖的单个异步 C# 任务的布尔返回值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章