【发布时间】:2020-01-23 23:23:36
【问题描述】:
我们有 WPF 应用程序,一旦设置了属性,它就会自动将数据保存到数据库中。保存的调用是在异步方法中。
我不需要等待电话。基本上就是一劳永逸,除非发生异常。
我们使用事件来处理这个问题,从属性设置器中调用事件。通过这种方式,我们可以拥有 async void 事件处理程序,然后在保存例程中一直处于 async/await 状态。异常处理与这种模式配合得很好。
private async void Save(object sender, PropertyChangedEventArgs e){}
private event PropertyChangedEventHandler SaveEvent;
public MyClass()
{
SaveEvent += Save;
}
public int Foo
{
get => _foo;
set
{
SetProperty(ref _foo, value);
SaveEvent?.Invoke(this, new PropertyChangedEventArgs());
}
}
我们真的需要这些事件吗?像这样直接调用 async void 方法有什么后果?特别是与异常处理有关的情况下,是否会捕获异常?
private async void Save(){}
public int Foo
{
get => _foo;
set
{
SetProperty(ref _foo, value);
Save();
}
}
【问题讨论】:
-
使用事件或直接调用
Save()功能相同。不直接调用它的最可能原因是async void方法的最佳实践建议,即您应该只将它用于事件处理程序
标签: c# properties async-await fire-and-forget