代码之家  ›  专栏  ›  技术社区  ›  Arunachalam

如何停止当前方法调用的执行

c#
  •  0
  • Arunachalam  · 技术社区  · 17 年前

    如果发生了一个条件,我必须停止当前方法调用的执行,并返回到方法调用之前的状态。我该怎么做呢?假设我正在执行某个示例方法,并且出现了一个条件,并且提示一个消息框,然后我希望在调用此函数之前返回到状态

    7 回复  |  直到 16 年前
        1
  •  -2
  •   JP Alioto    16 年前

    你可以使用 Memento pattern 实现对象回滚。从 here

    看门人要做点什么 给发起者,但想成为 可以撤消更改。看守人 首先要求发起人 纪念品对象。然后它做任何事 操作(或操作顺序) 就这样。回滚到 操作前的状态,它 将memento对象返回到 发起人。

    一旦您收到指示应该回滚的事件,就可以撤消更改并返回到调用方。这里有一些 info. and links 关于不应使用thread.abort的原因。

        2
  •  5
  •   Smashery    17 年前

    如果我对你的理解正确,如果某些条件为真,你希望撤销对某些变量所做的更改?如果是这种情况,您将希望存储所有变量(或整个类)的副本。然后,如果条件成立,那么在从函数返回之前,必须将所有这些变量恢复到初始状态。应该是这样的:

    // 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;
        }
    }
    
        3
  •  2
  •   waxwing    17 年前

    堆上的一般回滚功能对我来说是闻所未闻的。但您可以使用命令模式获取撤消功能,并使用它进行回滚:

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

    本质上,您将一个操作封装在一个对象中,该对象存储了足够的更改信息,可以撤消更改。将该对象推到堆栈上,当您的条件出现时,将弹出堆栈中的所有命令对象并撤消它们。如果没有关于你的案件的更多信息,就很难给出更具体的信息或判断这是否适用于你。

        4
  •  1
  •   lc.    17 年前

    这是一个错误条件,在调用该方法之前可能已经被检查过了吗?如果是这样,抛出异常。

    否则, return 有意义的东西(例如 void 函数,将其更改为返回 bool 并返回 false )

        5
  •  1
  •   tpdi    17 年前

    这就是例外的原因。抛出异常以终止函数和任何调用方,直到到达异常处理程序为止。

    请注意,只有在发生异常情况时才应执行此操作;异常不应用作“不同类型”的返回值,因为与正常返回相比,异常在代码大小(无论是否引发)和运行时间(如果引发)方面的成本更高。

    只要回到你以前的状态,这是可能的 如果 您的代码和进行调用的任何库代码都是用 异常安全 态度。

        6
  •  0
  •   shahkalpesh    17 年前

    我猜你是在谈论对象事务或事务性内存。

    你至少可以记录被修改对象的状态(分配),并在分配条件失败时在其上写入旧值。

        7
  •  0
  •   AnnaR    17 年前

    另一种解决方案与上述方案稍有不同:

    在示例方法中不时检查指定的条件。

    public void MyMethod()
    {
    some code
    
    if (conditionOccurred == true){ reset to the previous state and exit;}
    
    more code
    }
    

    这可能与书中的描述不符,但是如果您不经常使用它,它会提供非常简单和可读的代码。

    如果你想返回到程序状态,我可能不需要提到你需要保存程序的状态,你需要写一些代码来返回到这个状态。