如何将async Task方法赋值给多播委托/EventCallback参数
问题结论
把async Task改成async void的处理方式可临时解决编译/运行报错,但存在严重隐患,属于不推荐的野路子做法。
问题原因
原来的GridRowSelect方法签名为Func<Employee, Task>,你赋值时强制转换为无返回值的Action<Employee>,二者签名不匹配,因此抛出返回类型错误。
修改为async void后,方法签名符合Action<Employee>的无返回值要求,因此可以正常赋值运行。
async void的核心隐患
- 异常无法安全捕获:
async void方法抛出的异常无法被外层try/catch块捕获,会直接升高到当前同步上下文,大概率触发进程级崩溃,你无法对方法执行中的异常做容错处理。 - 执行时序不可控:调用方无法等待
async void方法执行完成,若后续逻辑依赖SetRowSelect的执行结果,会出现不可预期的时序问题,比如选中状态读取失效、后续操作拿到旧数据。 - 可测试性极差:单元测试无法等待
async void方法执行完成,测试用例无法覆盖该方法的异步逻辑。
正确解决方案
你当前使用的是Blazor的EventCallback,框架原生支持异步回调,不需要强制转Action,也不需要修改方法签名,直接用工厂方法创建回调即可:
// 保留原async Task的GridRowSelect方法不变 gridSettings.RowSelect = EventCallback.Factory.Create<Employee>(this, GridRowSelect);
如果是通用多播委托场景,不要用无返回值的Action<T>,改用对应支持异步返回的Func<T, Task>类型作为委托参数即可。
内容的提问来源于stack exchange,提问作者AnC Dev
相关产品推荐
相关产品推荐

