惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
小众软件
小众软件
I
InfoQ
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Martin Fowler
Martin Fowler
月光博客
月光博客
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
V
Visual Studio Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet未捕获异常导致系统崩溃问题 dotnet-dump安装、收集dump和崩溃自动收集dump EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 dotnet使用redis时需要注意的问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 关于EFCore插件API使用中踩过的坑 利用C#9.0中的record提高性能 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题 是否可以考虑做一个dotnet应用的性能诊断工具
.net c# Func<Task>及变体做为多播委托异步执行会另开...
Rick Carter · 2025-04-29 · via 博客园 - Rick Carter

1. 问题

环境是dotnet8及以前的版本,dotnet9+不知道是否还有这个问题(我猜是一样的)。
如下代码,在多播委托await异步执行时,不会等待委托方法执行完成,它们在新的线程中运行。

async Task A()
{
}
async Task B()
{
}
Func<Task> func;//下面+=运算赋值为多播委托
func+=async()=>await A();
func+=async()=>await B();

await func();//这里不会等待A和B方法执行完成,它们在新的线程中运行

2. 解决

用GetInvocationList方法取得所有委托方法,逐个执行。

Func<Task> func;//下面+=运算赋值为多播委托
func+=async()=>await A();
func+=async()=>await B();

var subscribers = func.GetInvocationList();//取得多播委托的每个方法然后逐个执行
foreach(var subscriber in subscribers)
{
    var asyncMethod = (Func<Task>)subscriber;
    await asyncMethod();
}

3. 总结

同样的道理,也适用于事件,因为事件本身也是委托。用这个办法就可以解决事件、委托、Action、Func等同步还是异步执行的问题。