簡體   English   中英

如何停止執行當前方法

[英]how to stop the execution of current method call

如果發生條件,我必須停止執行當前方法並返回到方法調用之前的狀態。我該怎么辦..假設我正在執行一些示例方法,並且條件發生並且我正在提示消息框然后我想回到此函數調用之前的狀態

如果我對您的理解正確,那么您希望撤消對某些變量所做的更改(如果某些條件成立)? 在這種情況下,您將要存儲所有變量(或整個類)的副本。 然后,如果條件成立,則必須將所有這些變量恢復為初始狀態,然后再從函數中返回。 就像這樣:

// 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;
    }
}

對我來說,堆上的通用回滾功能是聞所未聞的。 但是您可以使用命令模式來獲取撤消功能並將其用於回滾:

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

本質上,您將一個操作封裝在一個對象中,該對象存儲有足夠的更改信息,可以撤消該操作。 您將該對象壓入堆棧,然后在發生情況時,從堆棧中彈出所有命令對象並撤消它們。 如果沒有有關您案件的更多信息,很難提供更具體的信息或告訴您這是否適用。

是在調用該方法之前可能已經檢查過的錯誤條件嗎? 如果是這樣,則引發異常。

否則, return有意義的東西(例如,如果它是一個void函數,請將其更改為返回bool ,然后返回false )。

這就是例外。 您引發異常以終止函數和任何調用程序,直到到達異常處理程序為止。

請注意,只有在發生異常情況時才應這樣做。 異常不應用作“不同種類的”返回值,因為它們在代碼大小(是否拋出)和運行時間(如果拋出)方面比正常返回的代價更高。

只要返回到您以前的狀態, 如果您的代碼和進行調用的所有庫代碼均以異常安全的方式編寫,則可以做到這一點。

我猜您在談論對象事務或事務內存。

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

另一個解決方案,與上述解決方案略有不同:

現在再在示例方法中檢查指定條件。

public void MyMethod()
{
some code

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

more code
}

這可能不是本書所講的,但是如果您不經常使用它,它將給出非常簡單易讀的代碼。

我可能不必提一下,如果您希望能夠返回到程序狀態,則需要保存該程序的狀態,並且您需要編寫一些代碼以使您返回該狀態。

您可以使用Memento模式來實現對象回滾。 這里 ...

管理員將對發起者進行某些操作,但希望能夠撤消更改。 看守首先要向創建者索要紀念品。 然后,它執行將要執行的任何操作(或操作序列)。 要回滾到操作之前的狀態,它將紀念品對象返回給發起者。

一旦收到指示您應該回滾的事件,您就可以撤消更改並返回到調用方。 這是一些信息。 以及有關為什么不應該使用Thread.Abort的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM