c# - MVVM Light Call 属性更改的异步方法?

标签 c# wpf mvvm async-await mvvm-light

所以我一直在进行大量的挖掘工作,但我无法在任何地方找到任何真正明确的答案。

我正在使用 MVVM Light 和 WPF 编写应用程序。我有一项服务被注入(inject)到我的 ViewModel 中,用于检查所设置的某个属性的有效性。该服务进行网络调用,并且是异步的。该调用不需要停止应用程序的执行,它只是为了向用户提供有关输入值有效性的视觉反馈。

因此,我已经设法将一些东西组合在一起以使其正常工作,但感觉有点 hackey。

在不求助于 async void 之类的情况下,在属性更改时执行异步方法的正确方法是什么?

这是我目前拥有的。

    public string OmmaLicenseNumber
    {
        get => _ommaLicenseNumber;
        set
        {
            Set(() => OmmaLicenseNumber, ref _ommaLicenseNumber, value);
            Patient.OmmaLicenseNumber = value;

            var _ = CheckLicenseValid();
        }
    }

    private async Task CheckLicenseValid()
    {
        var valid = await _licenseValidationService.IsValidAsync(OmmaLicenseNumber);

        // We don't want the UI piece showing up prematurely. Need 2 properties for this;
        LicenseValid = valid;
        LicenseInvalid = !valid;
    }

如果我只是尝试在异步方法上调用 .Result,它会导致死锁,需要重新启动应用程序才能修复。虽然我的作品有效,但我并不是真正的粉丝。我还有哪些其他选择?

最佳答案

事件处理程序允许使用 async void

引用 Async/Await - Best Practices in Asynchronous Programming

public string OmmaLicenseNumber {
    get => _ommaLicenseNumber;
    set {
        Set(() => OmmaLicenseNumber, ref _ommaLicenseNumber, value);
        Patient.OmmaLicenseNumber = value;
        //Assuming event already subscribed 
        //i.e. OmmaLicenseNumberChanged += OmmaLicenseNumberChanged;
        OmmaLicenseNumberChanged(this, 
            new LicenseNumberEventArgs { LicenseNumber = value }); //Raise event
    }
}

private event EventHandler<LicenseNumberEventArgs> OmmaLicenseNumberChanged = delegate { };
private async void OnOmmaLicenseNumberChanged(object sender, LicenseNumberEventArgs args) {
    await CheckLicenseValid(args.LicenseNumber); //<-- await async method call
}

private async Task CheckLicenseValid(string licenseNumber) {
    var valid = await _licenseValidationService.IsValidAsync(licenseNumber);

    // We don't want the UI piece showing up prematurely. Need 2 properties for this;
    LicenseValid = valid;
    LicenseInvalid = !valid;
}

//...

public class LicenseNumberEventArgs : EventArgs {
    public string LicenseNumber { get; set; }
}

我认为这有点过分吗?

是的。这只是一个例子,表明它是可行的。

这可以重构为一些更简单的辅助/实用方法调用吗?

是的。可能看起来很像一个可等待的回调模式,使用表达式来获取要验证的值

关于c# - MVVM Light Call 属性更改的异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55369451/

相关文章:

c# - 对下拉列表进行排序

c# - 舍入 WPF 绑定(bind)中的值

c# - 如何在 C# 中打开程序集绑定(bind)日志记录?

wpf - 将 TabControl ItemsSource 绑定(bind)到 ViewModel 集合

wpf - 全屏模式下的 XBAP

c# - 更新到数据库 : Oracle 时出错

c# - Redis 消息包含 unicode?

debugging - MvvmLight打印消息进行调试

c# - MVVM:将单选按钮绑定(bind)到 View 模型?

.net - MVVM 中的启动逻辑应该放在哪里?