查看: 103|回覆: 0

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

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2009-3-29
發表於 2025-4-29 21:01:00 | 顯示全部樓層 |閲讀模式

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

回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部