2009-04-14 8 views
0

条件が発生した場合は、現在のメソッド呼び出しの実行を停止し、メソッド呼び出しの前の状態に戻す必要があります。これを行うにはどうすればよいですか?メソッドと条件が発生し、メッセージボックスのプロンプトが表示された後、この関数呼び出しの前に状態に戻りたい現在のメソッド呼び出しの実行を停止する方法

+0

実行されたメソッドがこの条件を検出するか、他のスレッドで検出されていますか? –

+1

「メソッド呼び出しの前の状態に戻る」とはどういう意味ですか?すべての課題を元に戻す? –

+0

この質問には次の質問がありました:http://stackoverflow.com/questions/744013/how-to-cancel-the-execution-of-a-methodも同様 –

答えて

-2

Memento patternを使用すると、オブジェクトのロールバックを実装できます。 here ...

から世話人は、発信元に何か をするつもりはなく、 変更を元に戻すことができるように望んでいるされています。ケアテイカー は、最初に発信者に メモオブジェクトを要求します。それから、 の操作(または一連の操作)が になるとします。操作の前の状態を にロールバックするには、 は オリジネーターにmementoオブジェクトを返します。

ロールバックする必要があることを示すイベントが表示されたら、変更を元に戻して呼び出し元に戻ることができます。なぜあなたがThread.Abortを使用すべきでないのかについては、info. and linksです。

+0

それは働いていましたが、メッセージボックスのスレッドが途絶えているのを避けています。 – Arunachalam

+0

私はこれがメッセージボックス外で発生しただけです。 これを行う方法 – Arunachalam

+0

Thread.Abortは現行の方法を停止したいコール。 return文を使うだけです。 – Smashery

1

メソッドを呼び出す前にチェックされていたエラー状態ですか?その場合は、例外をスローします。

それ以外の場合は、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

は基本的に、あなたはそれを元に戻すことができるというの変化の十分な情報を格納するオブジェクトの動作をカプセル化します。そのオブジェクトをスタックにプッシュし、条件が発生すると、スタックからすべてのコマンドオブジェクトをポップして元に戻します。あなたのケースに関する詳細情報がなければ、より具体的な情報を提供すること、またはこれがあなたに適しているかどうかを判断することは困難です。

関連する問題