所以我一直在进行大量的挖掘工作,但我无法在任何地方找到任何真正明确的答案。
我正在使用 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/