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