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