是否需要调用AsyncOperation.PostOperationCompleted?

时间:2008-12-04 17:45:27

标签: .net multithreading

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

我很好奇省略对PostOperationCompleted的调用是否是个好主意。文档表明它结束了操作的生命周期并使进一步的调用无效,但没有说明是否存在与此调用相关的内部行为,这是至关重要的。它确实暗示了省略呼叫可能会产生内部后果,但最后我没有看到任何强烈的建议,总是称之为。

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

2 个答案:

答案 0 :(得分:1)

欧文,

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

  1. 首先,有人如果使用这种结构的经验来到代码将期望某种类型的异步操作完成,所以它会让人感到困惑 - 你应该在代码中明确这一点

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

  3. 如果你真的需要,只调用Post版本,因为你再次耗尽资源,这里是提交给线程池的额外作业的名称,后来涉及上下文切换和作业处理。如果没有要求,请避免使用它,特别是如果第2点有效......尽管如此,最好调用适当的版本。

  4. HTH

    尼克。

答案 1 :(得分:0)

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

干杯, 丹:)