如何检查我正在覆盖的单个异步 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 的建议,但进行了搜索,但没有找到任何我需要的建议。 谢谢!好吧,也许是因为它与asyncawait 的主题有点重复。但恕我直言,仍应允许提出个别问题。 我根本不是在暗示你做任何检查不正确 - 我的观察不包含 if 所以它什么都不检查。我指出,就您的代码而言,它会引发警告/错误,例如 “此异步方法缺少 'await' 运算符并将同步运行。”。当你想在其中使用await 时,你可以用async 标记一个方法。 return true 的主体什么也不等待。 在方法内部,移除 await 并返回一个包含布尔值的已完成任务。这与 Tobias 对 await outside 方法的建议无关

以上是关于如何检查我正在覆盖的单个异步 C# 任务的布尔返回值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

meteor.js - 如何检查来自异步回调的值

Xamarin - 覆盖函数中的 iOS 异步任务

我如何检查字符串是返回布尔值的泰语,如 isalpha()

如何返回具有通用属性的 C# Web 服务?

如何获得业力覆盖率(伊斯坦布尔)来检查所有源文件的覆盖率?

Django:如何覆盖 form.save()?