You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor .NET 8:异步事件订阅报错,求正确订阅方法

解决异步事件订阅的类型转换错误

你的问题出在订阅事件时错误地调用了方法(OnNotify()),导致传递给事件的是Task实例,而事件定义要求的是Func<Task>委托(即方法本身的引用,不是方法执行后的结果)。

修正步骤:

  1. 修正订阅代码:去掉OnNotify后的括号,直接传递方法引用:
protected override Task OnInitializedAsync()
{
    Notifier.Notify += OnNotify; // 去掉(),传递方法本身而非执行结果
    return base.OnInitializedAsync();
}
  1. 添加取消订阅逻辑:组件销毁时务必移除事件订阅,避免内存泄漏:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:15:56