0

私は小さなスレッド フレームワークを設計していますが、そのスレッド フレームワークを最終的なコードに対してできるだけ透明にして、線形コードの構文にほとんど影響を与えないようにしたいと考えています。私はほとんどの部分を考えましたが、何かが私にかゆみを与えています: コンテキストを新しいスレッドに正常に切り替えるまで、関数呼び出しが解決されないようにパラメーターを定義する方法は?

アイデア:

var myTask = new Transaction();
myTask < xyz.abc();
myTask < xyz.def();
...some more code...
var result = waitfornext myTask;

本質的に、myTask は abc() および def() 呼び出しを取得してスレッドにパイプラインし、次に myTask のパイプラインが終了して abc() および def() に依存するコードが続行できるようになるまで、waitfor 演算子がブロックされます。いわばこれは .Net の await/async モデルですが、すべての .Net バージョンで使用でき、Java/XYZ 言語に移植できるように、独自の方法でやり直したいと考えています。

問題: abc() および def() 呼び出しは、戻り値を < 演算子に供給する前にコンパイラによって評価されますが、私が本当に望んでいるのは、これらの関数呼び出しを演算子に供給できるようにすることです。パイプライン スレッドの準備が整うまで、それらの実行を延期します。

理論的根拠: async/await モデルとは異なり、非同期化できるようにメソッドを変更する必要はなく、とにかくトランザクション化されたメソッドで任意のメソッドを使用できます。もう1つの利点は、数行を消去すると、コードが線形に戻ることです(非同期モデルにこの利点がないわけではありませんが、とにかく言及する価値があります)

何か案は?

4

2 に答える 2

1

xyz.abc()その場で評価されるパラメーターとして渡す代わりに、になることができる何かを xyz.abc()渡し、ターゲットメソッドを変更して「なる」ことを行います。

変化する

var evaluatedNow = SomeMethod(GetParameterValue());

...

object SomeMethod(SomeType value)
{
    // Do something with value
}

var evaluatedLater = SomeMethod(() => GetParameterValue());

...

object SomeMethod(Func<SomeType> valueGetter)
{
    SomeType value = valueGetter();
    // Do something with value
}
于 2012-09-05T15:18:17.053 に答える
1

演算子を使用<してオブジェクトにパラメーターを供給することは、一般の読者の期待に反するという意見は別として、ラムダを使用して関数を表すことができます。たとえばAction、値を返さないデリゲートは次のように使用できます。

Action abs = () => xyz.abc(); // The () => syntax creates a delegate from a piece of code
myTask.AddAction(abs); // Use a named function instead of operator `<`
myTask.AddAction(() => xyz.def()); // You do not need a variable
var result = myTask.Waitfornext();
于 2012-09-05T15:17:08.863 に答える