首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打电话给BeginInvoke MulticastDelegate?

打电话给BeginInvoke MulticastDelegate?
EN

Stack Overflow用户
提问于 2011-06-06 22:43:54
回答 2查看 1.8K关注 0票数 10

根据乔恩·斯基特的说法,“您只能在只有一个目标调用的委托上调用BeginInvoke。”

为什么会这样呢?真正原因是什么?

备注:需要澄清(因为我犯了这个错误),我指的是代表上的BeginInvoke,而不是控件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-07 00:16:05

我认为乔恩·斯基特在你链接的帖子中做得很好:

你希望线程如何工作?您必须同步运行每个调用,但针对调用线程异步运行整个过程,还是可以异步运行每个调用? 如果是前者,只需运行一个线程池工作项,它同步调用委托。如果是后者,则使用Delegate.GetInvocationList获取调用列表,然后依次对列表元素调用BeginInvoke。

基本上,在一个BeginInvoke上调用MulticastDelegate是模棱两可的,您希望委托之间互相等待吗?虽然理论上它可以为您做出决定,但通过以不同的方式调用委托,已经做出了强制您显式选择所需方法的选择。

换句话说,这是一种避免混淆的设计选择。另外,需要注意的是,BeginInvoke已不再受欢迎,而且可以使用新的异步编程方法,因此不太可能更新这一旧标准,因此即使他们现在想要改变,也没有理由去做。

票数 8
EN

Stack Overflow用户

发布于 2017-07-27 08:59:39

还有一个方法可以调用BeginInvoke对象上的System.MulticastDelegate方法:

代码语言:javascript
复制
public class Program{

   public delegate void SayHello();

   public void SayHelloAndWait(){
      Console.WriteLine("HELLO..");
      System.Threading.Thread.Sleep(5000);
      Console.WriteLine("..WORLD!");
   }

   public void SayHi(){
      Console.WriteLine("Hi world!");
   }

   public void Run(){
      SayHello helloMethods;
      helloMethods = SayHelloAndWait;
      helloMethods += SayHi;
      foreach(SayHello hello in helloMethods.GetInvocationList())
         hello.BeginInvoke(null,null);
   }

   public static void Main(String[] args){
      new Program().Run();
      Console.Read();
   }

}

因此,异步方法将根据调用列表从第一个调用到最后一个调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6258859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档