条件が発生した場合は、現在のメソッド呼び出しの実行を停止し、メソッド呼び出しの前の状態に戻す必要があります。これを行うにはどうすればよいですか?メソッドと条件が発生し、メッセージボックスのプロンプトが表示された後、この関数呼び出しの前に状態に戻りたい現在のメソッド呼び出しの実行を停止する方法
答えて
Memento patternを使用すると、オブジェクトのロールバックを実装できます。 here ...
から世話人は、発信元に何か をするつもりはなく、 変更を元に戻すことができるように望んでいるされています。ケアテイカー は、最初に発信者に メモオブジェクトを要求します。それから、 の操作(または一連の操作)が になるとします。操作の前の状態を にロールバックするには、 は オリジネーターにmementoオブジェクトを返します。
ロールバックする必要があることを示すイベントが表示されたら、変更を元に戻して呼び出し元に戻ることができます。なぜあなたがThread.Abortを使用すべきでないのかについては、info. and linksです。
それは働いていましたが、メッセージボックスのスレッドが途絶えているのを避けています。 – Arunachalam
私はこれがメッセージボックス外で発生しただけです。 これを行う方法 – Arunachalam
Thread.Abortは現行の方法を停止したいコール。 return文を使うだけです。 – Smashery
メソッドを呼び出す前にチェックされていたエラー状態ですか?その場合は、例外をスローします。
それ以外の場合は、void
機能の場合は、bool
を返し、false
を返すように変更してください。
これは例外です。例外ハンドラに達するまで、関数と任意の呼び出し元を終了するために例外をスローします。
これは、例外が発生した場合にのみ行う必要があります。コードサイズ(スローされたかどうか)と実行時間(スローされた場合)の面で、法線が返すよりもコストがかかるため、例外を「異なる種類の」戻り値として使用しないでください。コールが進行されて、あなたのコードと任意のライブラリコードが例外安全な方法で書かれていた場合
限り、あなたが前に持っていた状態に戻るように、これは可能です。
私はあなたがオブジェクト取引やトランザクションメモリの話をしていると思います。
少なくとも、変更するオブジェクトの状態(割り当て)を記録し、割り当ての条件が失敗したときに古い値を書き込むことができます。
正しく理解していれば、ある条件が満たされていれば、特定の変数に加えた変更を取り消したいですか?そうであれば、すべての変数(またはクラス全体)のコピーを保存することになります。あなたの状態が真実になったら、それらの変数をすべて元の状態に戻してから、関数から戻る必要があります。
// 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;
}
}
別の解決策、上記のものとは多少異なる:あなたのサンプルの方法でビット今して指定された条件の
チェックそれはこのようなものになるだろう。
public void MyMethod()
{
some code
if (conditionOccurred == true){ reset to the previous state and exit;}
more code
}
これはおそらく本によるものではありませんが、あまり頻繁に使用しないと、非常に簡単で読みやすいコードになります。
私はプログラムの状態を保存する必要があると言いたいことはありません。この状態に戻るコードを書く必要があります。
ヒープ上の一般的なロールバック機能は、私にとってはあまり知られていません。しかし、あなたは機能を元に戻す取得し、ロールバックのためにそれを使用するには、Commandパターンを使用することができます。
は基本的に、あなたはそれを元に戻すことができるというの変化の十分な情報を格納するオブジェクトの動作をカプセル化します。そのオブジェクトをスタックにプッシュし、条件が発生すると、スタックからすべてのコマンドオブジェクトをポップして元に戻します。あなたのケースに関する詳細情報がなければ、より具体的な情報を提供すること、またはこれがあなたに適しているかどうかを判断することは困難です。- 1. Flex - RemoteObjectメソッド呼び出しを中止/停止する方法
- 2. 現在実行中のコンソールアプリケーションでメソッドを呼び出します。
- 3. クライアントスクリプトの呼び出し後に実行を停止する方法
- 4. トランザクションのタイムアウト後にWCFでメソッド呼び出しの実行を停止する方法
- 5. 現在のクラスからメソッドの実装を呼び出す方法は?
- 6. 待つ呼び出しは、プログラムの実行フローを停止さ
- 7. メソッドを呼び出してcocos2dアニメーションを停止する方法は?
- 8. 現在実行中のコード行でデバッガを停止する
- 9. 現在実行中のスレッドを知り、それを停止する方法iOS
- 10. 現在の実行を停止せずにPythonを一時停止するメソッド/関数はありますか?
- 11. meteor:非同期呼び出しを停止する方法
- 12. 自動的にスレッドを停止するメソッドを呼び出す方法は?
- 13. P /呼び出し呼び出しが停止する
- 14. 停止したSparkContextのメソッドを呼び出せません
- 15. 停止メソッドの実行
- 16. 再帰関数呼び出しの後にループの実行が停止する -
- 17. Springでメソッドの実行を停止する方法AOP
- 18. メソッドが再び呼び出されるまでメソッドを一時停止する
- 19. メソッド呼び出しとメソッド実行
- 20. メソッドの実行を停止する - Swift
- 21. Atlassian Bambooは、現在実行中/実行中のビルドを停止します。
- 22. ロケーションリスナーサービスを停止する方法は? (現在停止していない)
- 23. メソッドが呼び出された後のスレッドの一時停止
- 24. Laravel実行前と実行後にジョブクラスのメソッドを呼び出す方法
- 25. 静的ミドルウェアの次の呼び出しを停止する方法
- 26. アクティビティの再開中にonConnectedの呼び出しを停止する方法(Android)
- 27. 現在の呼び出しスタックをPythonコードのメソッドから出力する
- 28. jquery uiスピナー停止イベントで関数を呼び出す方法
- 29. 関数を呼び出すと、コード実行が一時停止しますか?
- 30. 実行時にjarファイルからメソッドを呼び出す方法
実行されたメソッドがこの条件を検出するか、他のスレッドで検出されていますか? –
「メソッド呼び出しの前の状態に戻る」とはどういう意味ですか?すべての課題を元に戻す? –
この質問には次の質問がありました:http://stackoverflow.com/questions/744013/how-to-cancel-the-execution-of-a-methodも同様 –