根据乔恩·斯基特的说法,“您只能在只有一个目标调用的委托上调用BeginInvoke。”
为什么会这样呢?真正原因是什么?
备注:需要澄清(因为我犯了这个错误),我指的是代表上的BeginInvoke,而不是控件。
发布于 2011-06-07 00:16:05
我认为乔恩·斯基特在你链接的帖子中做得很好:
你希望线程如何工作?您必须同步运行每个调用,但针对调用线程异步运行整个过程,还是可以异步运行每个调用? 如果是前者,只需运行一个线程池工作项,它同步调用委托。如果是后者,则使用Delegate.GetInvocationList获取调用列表,然后依次对列表元素调用BeginInvoke。
基本上,在一个BeginInvoke上调用MulticastDelegate是模棱两可的,您希望委托之间互相等待吗?虽然理论上它可以为您做出决定,但通过以不同的方式调用委托,已经做出了强制您显式选择所需方法的选择。
换句话说,这是一种避免混淆的设计选择。另外,需要注意的是,BeginInvoke已不再受欢迎,而且可以使用新的异步编程方法,因此不太可能更新这一旧标准,因此即使他们现在想要改变,也没有理由去做。
发布于 2017-07-27 08:59:39
还有一个方法可以调用BeginInvoke对象上的System.MulticastDelegate方法:
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();
}
}因此,异步方法将根据调用列表从第一个调用到最后一个调用。
https://stackoverflow.com/questions/6258859
复制相似问题