为什么可以在同一个委托实例上多次调用BeginInvoke?

时间:2010-03-10 15:30:18

标签: .net multithreading begininvoke

我认为在同一个委托实例上不止一次调用BeginInvoke会导致问题,但我尝试了它并且它有效。 为什么?

每个IAsyncResult返回的BeginInvoke对象是否称为唯一,而不是委托的每个实例?

换句话说,我是否只需要一个委托实例来产生对其功能的多次调用?

4 个答案:

答案 0 :(得分:3)

为什么不起作用?每次调用它时,它都将开始在线程池线程上执行该委托的操作。是的,每个IAsyncResult将独立于其他BeginInvoke,表示异步操作。

是的,您只需要一个代理实例。请注意,委托是不可变的 - 调用Delegate.Combine不会改变其状态。您可以安全地获取委托引用的副本,因为知道调用{{1}}等将始终创建委托实例,而不是修改现有委托实例。

答案 1 :(得分:2)

每次调用BeginInvoke都会在.net线程池中触发一个新请求。

多次致电BeginInvoke是完全可以接受的。每个IAsyncResult对象对于BeginInvoke的特定调用都是唯一的。

请务必确保为每次EndInvoke来电拨打BeginInvoke,以确保清理资源。

(请注意,每个调用都不一定等同于一个线程。BeginInvoke将请求传递给线程池,如果池中的所有线程都已在使用中,则可以将请求排队)

答案 2 :(得分:1)

例如,您可能有多个线程调用同一个委托实例,因为您希望它们都执行相同的任务。

答案 3 :(得分:1)

每次调用BeginInvoke都会返回不同的IAsyncResult,可以按任意顺序传递给EndInvoke

您可以使用同一个委托进行多次异步调用。