Blazor .NET 8:异步事件订阅报错,求正确订阅方法
解决异步事件订阅的类型转换错误
你的问题出在订阅事件时错误地调用了方法(OnNotify()),导致传递给事件的是Task实例,而事件定义要求的是Func<Task>委托(即方法本身的引用,不是方法执行后的结果)。
修正步骤:
- 修正订阅代码:去掉
OnNotify后的括号,直接传递方法引用:
protected override Task OnInitializedAsync() { Notifier.Notify += OnNotify; // 去掉(),传递方法本身而非执行结果 return base.OnInitializedAsync(); }
- 添加取消订阅逻辑:组件销毁时务必移除事件订阅,避免内存泄漏:
public void Dispose() { Notifier.Notify -= OnNotify; }
如果是Blazor组件,需要让组件实现IDisposable接口。
完整正确代码示例:
服务定义(保持不变):
public event Func<Task> Notify; public async Task Subscribe(string value) { // 业务逻辑... if (Notify != null) { await Notify.Invoke(); } }
子组件实现:
public class YourComponent : ComponentBase, IDisposable { [Inject] public YourNotifierService Notifier { get; set; } = null!; protected override Task OnInitializedAsync() { Notifier.Notify += OnNotify; return base.OnInitializedAsync(); } private async Task OnNotify() { await InvokeAsync(() => { // 你的业务逻辑... StateHasChanged(); }); } public void Dispose() { Notifier.Notify -= OnNotify; } }
关键说明:
Func<Task>是无参数、返回Task的委托类型,你需要传递的是符合该签名的方法本身(OnNotify),而非调用方法后生成的Task对象(OnNotify())。- 触发事件前建议先判断事件是否为null,避免空引用异常。
内容的提问来源于stack exchange,提问作者GH DevOps
相关产品推荐
相关产品推荐

