代码之家  ›  专栏  ›  技术社区  ›  dummzeuch Stijn Sanders

“长时间运行方法完成”是否有设计模式?

  •  2
  • dummzeuch Stijn Sanders  · 技术社区  · 15 年前

    我有一个方法需要很长时间才能完成,并且希望定期检查是否完成。这就是我想到的(简化代码,Delphi2007):

    type
      IWaitForDone = interface
        function IsDone: boolean;
      end;
    
    function TSomeClass.doSomethingThatTakesLong: IWaitForDone;
    begin
      Result := TClassThatDoesIt.Create;
    end;
    
    var
      Waiter: IWaitForDone;
    begin
       Waiter := SomeClass.doSomethingThatTakesLong;
       while not Waiter.isDone do
         doSomethingElse;
       Waiter := nil;
    end;
    

    在上下文中,调用is done可能实际上完成了要完成的工作的一部分,并且在完成时返回true,在还有部分要完成时返回false。或者,它可以检查另一个线程是否完成了它的工作。我不想让打电话的人看到这个。

    我想我不是第一个遇到这种问题的人,而且这个解决方案可能已经有了一个名字(设计模式?)但是我找不到它。 那它叫什么?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Russell Troywest    15 年前

    我以前见过这被称为“未来”。

    以下是几个链接:

    这是由一个多产的.NET开发人员OrenEini编写的。作为旁白-如果你对编码Patterns、最佳实践等感兴趣的话,很值得阅读他的博客(这个链接来自哪里)。

    Futures post from Oren Eini (Ayende@Rahien)

    这个链接是你的,但我想我只需要更新答案就可以完成了。

    Futures link from uni-sb.de

        2
  •  4
  •   Dzmitry Huba    15 年前

    微软为长时间运行的方法建议了两种模式(异步调用并根据模式集合)

        3
  •  3
  •   Alex    15 年前

    不确定这是否对您有帮助/适合,但请看一下 AsyncCalls 单位。

        4
  •  1
  •   jpfollenius Rob Kennedy    15 年前

    我不确定我是否正确理解您的问题,但我不喜欢这样的想法,即部分实际工作是在is done函数(有趣的句子)中完成的。我希望这样的方法只检查一些标志并快速返回。如果我决定不继续调用isdone,而是执行其他工作,然后检查isdone,会怎么样?然后,在第一次调用之前,没有做任何工作——这并不是我从异步调用中所期望的……

    我没有真正回答你的问题,但我怀疑这是一个广泛使用的设计模式。