代码之家  ›  专栏  ›  技术社区  ›  OwenP

正在调用AsyncOperation。操作完成后是否需要?

  •  1
  • OwenP  · 技术社区  · 17 年前

    我在用 AsyncOperation 类,以避免编写大量的“if(control.InvokeRequired)then/else”方法(与基于事件的异步模式中的传统角色相反)。在某些情况下,我并不真正关心在工作线程完成时收到通知。因此,我不想打电话给 PostOperationCompleted 我的方法 异步操作 ,因为这需要我编写一个无所事事的回调函数。

    我很好奇,不打电话给 操作完成后 文档表明它结束了操作的生命周期,并使进一步的调用无效。它没有明确说明是否存在与此调用相关的重要内部行为。这在一定程度上暗示了省略调用可能会产生内部后果,但最终我没有看到任何强烈的建议总是调用它。

    那么,我是否应该认为省略通话是不好的做法,还是没什么大不了的?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Nick Robinson    17 年前

    欧文,

    如果您知道在您的情况下不需要将编组返回到原始调用者线程,那么您应该只调用OperationCompleted。在您的操作与其底层SynchronizationContext之间有一个隐含的简单状态机。如果你知道一旦你的操作停止,它就不会在应用程序的其他部分使用,那么这本身就不是问题。虽然这实际上是可以的,但从程序的角度来看,它需要考虑以下几点:

    1. 首先,有使用此构造经验的人在代码中会期望异步操作以某种方式完成,所以这会令人困惑——你应该在代码中明确这一点。

    2. 完成操作的一个关键方面是从终结器列表中删除对象。对于一两个实例,这可能不是问题,但如果这些操作的数量很大,您肯定会受到性能影响,因为您将允许所有这些AsyncOperation实例升级,GC必须做更多的工作。因此,您至少应该调用OperationCompleted来避免这种情况。

    3. 如果你真的需要,只调用Post版本,因为你再次用完了资源,这里是以提交给线程池的额外作业的名义,稍后涉及上下文切换和作业处理。如果不需要,请避免使用,特别是如果第2点有效。..但为了良好的实践,最好调用适当的版本。

    人酪氨酸羟化酶

    尼克。

        2
  •  0
  •   Dan Dan    17 年前

    PostOperationCompleted的文档指出“AsyncOperation对象将确保在适用于应用程序模型的线程或上下文上调用您的委托”。如果您的GUI线程需要在后台操作完成后执行某些操作,这一点非常重要。我认为这可能是首先使用这个类的最重要原因!

    干杯, 丹:)