代码之家  ›  专栏  ›  技术社区  ›  Adam Neal

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

  •  1
  • Adam Neal  · 技术社区  · 15 年前

    我以为打电话 BeginInvoke 在同一个委托实例上执行多次可能会导致问题,但我尝试了一下,结果成功了。 为什么?

    IAsyncResult 对象随每个 调用unique而不是委托的每个实例?

    我是否只需要委托的一个实例来派生对其函数的多个调用?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Simon P Stevens    15 年前

    每次呼叫 BeginInvoke 触发对.net线程池的新请求。

    打电话是完全可以接受的 异步调用 IAsyncResult 对象对于对的特定调用是唯一的 异步调用 .

    只是要小心,确保你打了一个匹配的电话 EndInvoke 异步调用 给您打电话,确保资源已清理干净。

    异步调用 将请求传递到线程池,如果池中的所有线程都已在使用中,线程池可能会对请求进行排队)

        2
  •  3
  •   Jon Skeet    15 年前

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

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

        3
  •  1
  •   Will Marcouiller    15 年前

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

        4
  •  1
  •   SLaks    15 年前

    对。

    BeginInvoke 将返回一个不同的 IAsyncResult ,可以传递给 EndInvoke 以任何顺序。