考えてみてください - あなたの行動はどこcondition
から得られるでしょうか? 追加のパラメーターとして提供するか、アクションのクロージャーでキャッチする必要があります (存在する場合)。または、アクションが Object.Method を指す通常のデリゲートである場合は、任意のフィールド/プロパティを条件として使用できますが、それは典型的なメソッドの実装にすぎません..
(A)
someT.With( (x,stopConditionHolder) => { while(!stopConditionHolder.StopNow) dosomething; });
// of course, now With() has to get the holder object from somewhere..
(B)
var stopConditionHolder = new ... ();
stopConditionHolder.StopNow = false;
someT.With( (x,stopNow) => { while(!stopConditionHolder.StopNow) dosomething; });
// now you can use the holder object to 'abort' at any time
stopConditionHolder.StopNow = true; // puff!
(C)
class MyAction
{
public bool stopNow = false;
public void PerformSomething()
{
while(!stopNow)
dosomething;
}
}
var actionObj = new MyAction();
someT.With( actionObj.PerformSomething );
// note the syntax: the PerformSomething is PASSED, not called with ().
// now you can use the holder object to 'abort' at any time
actionObj.stopNow = true; // puff!
CancellationToken
また、そのような「中断」のために正確に作成されたフレームワークのクラスを見たいと思うかもしれません。これCancellationToken
は「標準の StopNow ホルダー」であり、操作に渡し、非同期で中止するように命令できます。もちろん、「操作」は、while(!stop) で行ったように、そのトークンを時々チェックする必要があります。
また、何かを「激しく」中止したい場合、特にそのものが「キャンセルされる準備ができていない」場合は、次のことを確認してください。
- ターゲットスレッドで InterrupedException を発生させる Thread.Interrupt は、任意の Sleep/Wait からそれを「起こし」ますが、.. そのメソッドから例外を発生させることによって
- ThreadAbortException を発生させる Thread.Abort - 同様に、しかしより厳しい方法..
ただし、どちらの場合も、「ハング」したワーカー スレッドに正確にアクセスする必要があります。多くの場合、これは不可能です。