呼延含玉 发表于 2025-5-29 10:56:07

.net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题

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等同步还是异步执行的问题。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

遑盲 发表于 2025-10-12 00:41:56

收藏一下   不知道什么时候能用到

赊朗爆 发表于 2025-12-10 16:35:39

感谢,下载保存了

诀锺 发表于 2025-12-20 13:45:50

谢谢分享,试用一下

奚娅琼 发表于 2025-12-21 15:38:40

yyds。多谢分享

事确 发表于 2025-12-23 22:47:28

谢谢分享,试用一下

兮督 发表于 2025-12-24 22:36:34

感谢,下载保存了

幌斛者 发表于 2026-1-4 19:37:57

用心讨论,共获提升!

雨角 发表于 2026-1-12 17:15:42

新版吗?好像是停更了吧。

姚梨素 发表于 2026-1-13 19:23:18

感谢分享,学习下。

肿抢 发表于 2026-1-14 03:34:01

感谢分享,学习下。

澹台忆然 发表于 2026-1-14 08:27:23

分享、互助 让互联网精神温暖你我

赀倦 发表于 2026-1-14 10:58:32

不错,里面软件多更新就更好了

劳暄美 发表于 2026-1-19 00:38:40

谢谢楼主提供!

申倩语 发表于 2026-1-20 13:24:42

分享、互助 让互联网精神温暖你我

阎逼 发表于 2026-1-21 17:08:49

不错,里面软件多更新就更好了

挺喽蹂 发表于 2026-1-21 22:02:05

感谢分享,学习下。

缑娅瑛 发表于 2026-1-23 10:00:14

谢谢分享,试用一下

痕伯 发表于 2026-1-24 04:07:41

谢谢楼主提供!

史穹逊 发表于 2026-1-26 17:27:26

不错,里面软件多更新就更好了
页: [1] 2
查看完整版本: .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题