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

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

来源链接:https://www.cnblogs.com/pains/p/18854297

© 版权声明
THE END
支持一下吧
点赞10 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容