2009-07-23 19 views
2

我有一種方法需要很長時間才能完成,並且需要定期檢查它是否完成。這是我想出了(簡化代碼,德爾福2007年):「長跑法完成」是否有設計模式?

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; 

在有可能調用isDone實際上做的是什麼做的一部分,完成和假時返回true,上下文同時還有部分工作要做。或者,它可以檢查是否有其他線程完成其工作。我不希望這個對調用者可見。

我想我不是第一個遇到這種類型的問題,這個解決方案可能已經有一個名稱(設計模式?),但我找不到它。 那叫什麼?

+0

這是用於Windows應用程序嗎? – 2009-07-23 09:31:58

+0

是的,但爲什麼這很重要? – dummzeuch 2009-07-23 14:01:15

回答

2

我已經看到了這個被稱爲「未來」之前。

這裏有幾個環節:

這一個是奧倫埃尼誰是一位多產的.NET開發人員。順便說一句 - 這是很值得一讀他的博客(其中該鏈接是)如果你有興趣在編碼pattterns,最佳實踐等..

Futures post from Oren Eini ([email protected])

而這個鏈接是你的,但我想我只需更新答案即可完成。

Futures link from uni-sb.de

3

不知道有沒有什麼幫助/適合你,但看看AsyncCalls單元。

1

我不確定我是否正確理解你的問題,但我不喜歡在IsDone函數(有趣的句子)中完成部分實際工作的想法。我希望有一種方法來檢查一些標誌並快速返回。如果我決定不連續調用IsDone而是執行一些其他工作並在此之後檢查IsDone?然後,直到第一次通話才完成工作 - 不是我期望從異步調用中得到的結果...

我沒有真正回答您的問題,但我懷疑這是一種廣泛使用的設計模式。

相關問題