0

次の拡張メソッドがあります。

public static void With<T>(this T value, Action<T> action);

私は次のように使用します:

someT.With(x => { /* Do something with x */ })

アクション実行に条件を適用するにはどうすればよいですか? 何かのようなもの:

someT.With(x => { /* if (condiction) stopAction */ })

これは可能ですか?

4

2 に答える 2

2

考えてみてください - あなたの行動はどこ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 - 同様に、しかしより厳しい方法..

ただし、どちらの場合も、「ハング」したワーカー スレッドに正確にアクセスする必要があります。多くの場合、これは不可能です。

于 2013-11-07T12:23:19.047 に答える