【发布时间】:2021-08-27 10:26:12
【问题描述】:
是否允许将通常的事件处理程序从 void 转换为基于 Task 并像下面这样等待它?
Something.PropertyChanged += async (o, args) => await IsButtonVisible_PropertyChanged(o, args);
Something.PropertyChanged -= async (o, args) => await IsButtonVisible_PropertyChanged(o, args);
private Task IsButtonVisible_PropertyChanged(object sender,PropertyChangedEventArgs e)
{
if (IsSomthingEnabled)
{
return SomeService.ExecuteAsync(...);
}
return Task.CompletedTask;
}
还是这样?
Something.PropertyChanged += IsButtonVisible_PropertyChanged;
Something.PropertyChanged -= IsButtonVisible_PropertyChanged;
private void IsButtonVisible_PropertyChanged(object sender,PropertyChangedEventArgs e)
{
if (IsSomthingEnabled)
{
_ = SomeService.ExecuteAsync(...);
}
}
更新: 或者这个,我知道应该禁止使用 Task void ,因为异常它没有被捕获,但也许对于 Eventhandler 的情况是可以的,因为 Eventhandler 没有返回。
Something.PropertyChanged += IsButtonVisible_PropertyChanged;
Something.PropertyChanged -= IsButtonVisible_PropertyChanged;
private async void IsButtonVisible_PropertyChanged(object sender,PropertyChangedEventArgs e)
{
if (IsSomthingEnabled)
{
await = SomeService.ExecuteAsync(...);
}
}
【问题讨论】:
-
事件处理程序不会返回,因此无需等待,如果您需要来自事件的响应,那么您应该创建一个具有可等待值的事件 arg,(很可能是偶数就其本身而言)
-
这对我来说很有意义,谢谢。
-
正确的语法是第二个
async void。这是唯一应该使用async void的情况 -
您可能正在寻找
TaskCompletionSource来触发方法;并等待一个事件;给await它 -
在 await 和正在等待的项目之间不需要 =
标签: c# asynchronous async-await eventhandler