2009-04-14 30 views
0

如果發生某種情況,我必須停止當前方法調用的執行並返回到方法調用前的狀態.how我可以這樣做..假設ai正在執行一些樣本方法和條件發生,我正在提示一個消息框,然後我希望返回到此函數調用之前的狀態如何停止執行當前方法調用

+0

執行的方法檢測到這種情況,還是在其他某個線程中檢測到它? – 2009-04-14 06:43:10

+1

你是什麼意思「返回方法調用之前的狀態」?恢復所有的作業? – 2009-04-14 06:45:00

回答

-2

您可以使用Memento pattern來實現對象回滾。從here ...

看守打算做些什麼 的鼻祖,但想成爲 能夠撤消更改。管理員 首先要求發件人提供 紀念品對象。然後,它會執行任何要運行的操作(或操作序列) 。要回滾到操作前的狀態 ,它 將紀念物件返回到發件人 。

一旦您收到指示您應該回滾的事件,您可以撤消更改並返回給調用者。這裏有一些info. and links爲什麼你不應該使用Thread.Abort。

1

是否在調用方法之前可能已檢查錯誤條件?如果是這樣,拋出一個異常。

否則,return有意義的東西(例如,如果它是void函數,將其更改爲返回bool,並返回false)。

1

這是例外情況。您拋出異常終止函數和任何調用者,直到達到異常處理程序。

請注意,只有在出現異常情況時才應該這樣做;不應將異常用作「不同類型」的返回值,因爲它們在代碼大小(無論是否拋出)和運行時間(如果拋出)方面的成本更高,而不是正常返回值。

至於回到你前的狀態,這是可能的,如果代碼和任何庫代碼,通過該電話進行寫在異常安全方式。

0

我猜你正在談論對象事務或事務內存的問題。

您至少可以做的是記錄被修改對象的狀態(賦值),並在賦值條件失敗時在其上寫入舊值。

5

如果我正確地理解了你,你想撤銷你對某些變量做出的改變,如果某些條件成立的話?如果是這樣的話,你會想要存儲所有變量的副本(或整個類)。然後,如果您的條件成立,您必須在從函數返回之前將所有這些變量恢復到其初始狀態。這將是這樣的:

// In order to clone your variable, you may need to inherit from 
// ICloneable and implement the Clone function. 
bool MyFunction(ICloneable c) 
{ 
    // 1. Create a copy of your variable 
    ICloneable clone = c.Clone(); 

    // 2. Do whatever you want in here 
    ... 

    // 3. Now check your condition 
    if (condition) 
    { 
     // Copy all the attributes back across to c from your clone 
     // (You'll have to write the ResetAttributes method yourself) 
     c.ResetAttributes(clone); 

     // Put a message box up 
     MessageBox.Show("This failed!"); 

     // Now let the caller know that the function failed 
     return false; 
    } 
    else 
    { 
     // Let the caller know that the function succeeded 
     return true; 
    } 
} 
0

另一種解決方案,從上面那些略微不同:

檢查指定條件的位,然後現在在你的樣品的方法。

public void MyMethod() 
{ 
some code 

if (conditionOccurred == true){ reset to the previous state and exit;} 

more code 
} 

這可能不符合本書的內容,但如果不經常使用它,它會給出相當簡單易讀的代碼。

我可能不需要提及,如果你想能夠返回它,你需要保存程序的狀態,並且你需要編寫一些代碼返回到這個狀態。

2

堆上的通用回滾功能對我來說是前所未聞的。但是你可以使用Command模式來獲得撤消功能,並用它來回滾:

http://en.wikipedia.org/wiki/Command_pattern

基本上你在存儲變化的足夠多的信息,它可以撤消它的對象封裝的操作。您將該對象推入堆棧,並且當您的條件發生時,您將彈出堆棧中的所有命令對象並將其撤銷。如果沒有關於您的案例的更多信息,則很難提供更具體的信息或判斷這是否適用於您。