2

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

返回的IAsyncResult对象是否与每个BeginInvoke调用的唯一而不是委托的每个实例一起返回?

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

4

4 回答 4

3

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

是的,您只需要一个委托实例。请注意,委托是不可变的——调用BeginInvoke不会改变它的状态。您可以安全地获取委托引用的副本,知道调用Delegate.Combineetc 将始终创建一个的委托实例,而不是修改现有的委托实例。

于 2010-03-10T15:33:32.977 回答
3

每次调用都会BeginInvoke触发对 .net 线程池的新请求。

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

请注意确保EndInvoke为每次BeginInvoke调用都进行匹配调用,以确保资源得到清理。

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

于 2010-03-10T15:34:08.213 回答
1

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

于 2010-03-10T15:33:02.993 回答
1

是的。

每次调用BeginInvoke都会返回一个不同IAsyncResult的 ,可以以EndInvoke任何顺序传递给它。

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

于 2010-03-10T15:33:51.677 回答