找回密码
 立即注册
首页 资源区 代码 .net c# Func<Task>及变体做为多播委托异步执行会另开线 ...

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

呼延含玉 2025-5-29 10:56:07
1. 问题

环境是dotnet8及以前的版本,dotnet9+不知道是否还有这个问题(我猜是一样的)。
如下代码,在多播委托await异步执行时,不会等待委托方法执行完成,它们在新的线程中运行。
  1. async Task A()
  2. {
  3. }
  4. async Task B()
  5. {
  6. }
  7. Func<Task> func;//下面+=运算赋值为多播委托
  8. func+=async()=>await A();
  9. func+=async()=>await B();
  10. await func();//这里不会等待A和B方法执行完成,它们在新的线程中运行
复制代码
2. 解决

用GetInvocationList方法取得所有委托方法,逐个执行。
  1. Func<Task> func;//下面+=运算赋值为多播委托
  2. func+=async()=>await A();
  3. func+=async()=>await B();
  4. var subscribers = func.GetInvocationList();//取得多播委托的每个方法然后逐个执行
  5. foreach(var subscriber in subscribers)
  6. {
  7.     var asyncMethod = (Func<Task>)subscriber;
  8.     await asyncMethod();
  9. }
复制代码
3. 总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册