.net 为什么可以在同一个委托实例上多次调用BeginInvoke?
我原以为在同一个委托实例上多次调用.net 为什么可以在同一个委托实例上多次调用BeginInvoke?,.net,multithreading,begininvoke,.net,Multithreading,Begininvoke,我原以为在同一个委托实例上多次调用BeginInvoke会导致问题,但我尝试了一下,效果不错这是为什么? 与每个BeginInvoke一起返回的IAsyncResult对象是否称为唯一对象,而不是委托的每个实例 换句话说,我是否只需要委托的一个实例就可以生成对其函数的多个调用?您可能有多个线程调用同一个委托实例,例如,根据您希望它们都执行相同的任务。为什么它不起作用?每次调用它时,它都会开始在线程池线程上执行该委托的操作。是的,每个IAsyncResult都将独立于其他对象,表示异步操作 是的,
BeginInvoke
会导致问题,但我尝试了一下,效果不错这是为什么?
与每个BeginInvoke
一起返回的IAsyncResult
对象是否称为唯一对象,而不是委托的每个实例
换句话说,我是否只需要委托的一个实例就可以生成对其函数的多个调用?您可能有多个线程调用同一个委托实例,例如,根据您希望它们都执行相同的任务。为什么它不起作用?每次调用它时,它都会开始在线程池线程上执行该委托的操作。是的,每个
IAsyncResult
都将独立于其他对象,表示异步操作
是的,您只需要委托的一个实例。请注意,委托是不可变的-调用BeginInvoke
不会更改其状态。您可以安全地复制一份委托引用,因为调用delegate.Combine
etc将始终创建一个新的委托实例,而不是修改现有的委托实例。是
每次调用
BeginInvoke
都将返回不同的IAsyncResult
,可以按任何顺序传递到EndInvoke
您可以使用同一个委托进行多个异步调用。对
BeginInvoke
的每次调用都会触发对.net线程池的新请求
多次调用BeginInvoke
是完全可以接受的。每个IAsyncResult
对象对于对BeginInvoke
的特定调用都是唯一的
只是要小心,确保您对每个BeginInvoke
调用都进行匹配的EndInvoke
,以确保资源得到清理
(请注意,每个调用不一定等同于一个线程。BeginInvoke
将请求传递给线程池,如果池中的所有线程都已在使用,线程池可能会对请求进行排队。)