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

如何在C#中声明异步事件Action类型并改造现有同步事件?

如何在C#中实现异步事件

你直接尝试public Task event Action<TValue1, TValue2, TValue3> OnAddChange;行不通是因为C#不允许直接给事件加Task修饰符,而且Action委托本身是同步的,没法直接适配异步回调逻辑。我们需要换用异步兼容的委托类型,并调整事件触发的逻辑来处理异步操作。

1. 改造可注入服务的实现

首先,把事件的委托类型替换为Func<TValue1, TValue2, TValue3, Task>,这样订阅者可以提供异步方法作为回调。然后修改通知方法,异步遍历所有订阅者并调用,同时单独处理每个回调的异常(避免单个订阅者的异常影响其他订阅者):

// 将同步Action委托替换为异步兼容的Func委托
public event Func<TValue1, TValue2, TValue3, Task> OnAddChange;

public async Task AddReport(TValue1 var1, TValue2 var2, TValue3 var3)
{
    await NotifyAddChanged(var1, var2, var3);
}

private async Task NotifyAddChanged(TValue1 var1, TValue2 var2, TValue3 var3)
{
    // 先获取当前订阅的委托副本,避免并发订阅/取消导致的枚举异常
    var handlers = OnAddChange;
    if (handlers == null) return;

    // 遍历所有订阅者,逐个执行异步回调并捕获异常
    foreach (var handler in handlers.GetInvocationList().Cast<Func<TValue1, TValue2, TValue3, Task>>())
    {
        try
        {
            await handler(var1, var2, var3);
        }
        catch (Exception ex)
        {
            // 这里可以添加日志记录或异常处理逻辑,根据业务需求调整
            // 确保单个订阅者的异常不会中断整个通知流程
        }
    }
}

2. 改造消费者的实现

消费者的回调方法需要改成异步形式,同时保持订阅和取消订阅的逻辑(如果是Blazor组件,要确保正确实现IDisposable接口):

protected override async Task OnInitializedAsync()
{
    // 订阅异步事件
    MyService.OnAddChange += AddToListAsync;
    await base.OnInitializedAsync();
}

public void Dispose()
{
    // 取消订阅,防止内存泄漏
    MyService.OnAddChange -= AddToListAsync;
}

// 异步回调方法
private async Task AddToListAsync(TValue1 variable1, TValue2 variable2, TValue3 variable3)
{
    // 这里编写你的异步业务逻辑,比如异步调用API、异步更新数据等
    // 如果是Blazor组件,更新UI后需要调用StateHasChanged()触发渲染
    await SomeAsyncBusinessOperation();
    StateHasChanged();
}

关键注意事项

  • 委托类型选择:必须使用Func<..., Task>而非Action<...>,因为Func支持返回Task,能适配异步方法的返回值要求。
  • 并发安全:触发事件前先获取委托副本,避免遍历过程中订阅者被移除导致的空引用或枚举异常。
  • 异常隔离:每个异步回调的异常单独捕获处理,防止单个订阅者的错误中断整个通知流程。
  • Blazor特殊处理:在Blazor组件的异步回调中,若需要更新UI,记得调用StateHasChanged()触发组件重新渲染。

内容的提问来源于stack exchange,提问作者user3856437

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:47:49