12

私は非常に非同期のアプリケーションを作成します。

BeginInvoke / EndInvokeと同様に、メソッド呼び出しをキューに入れる方法を探していますが、自分のキューにあります。その理由は、スレッドプールを使用して独自の最適化されたメッセージキューシステムを使用していると同時に、すべてのコンポーネントがリクエストでシングルスレッドであることを確認していることです(つまり、1つのスレッドがコンポーネントのメッセージのみを処理します)。

たくさんのメッセージが行き来しています。限られた用途では、多くの管理呼び出しを行うためだけに独自のパラメーター、メソッドのラッピング/アンラッピングを定義するのではなく、パラメーターを使用してメッセージ呼び出しをキューに入れることができるようにしたいと思います。また、常にキューをバイパスする必要はありません。また、送信サービスが他のサービスの応答を待機することを絶対に望んでいません。

メソッド呼び出しを傍受する方法を知っている人はいますか?これにTransparentProxy/Virtual Proxyを利用する方法はありますか?;)ServicedComponent?私はこれをできるだけオーバーヘッドを少なくしたいと思います;)

4

3 に答える 3

14

ラムダを使用するのはどうですか?

つまり、キューを作成して、次のような方法で処理してみませんか。

while (!queue.Empty) 
{
    Action action = queue.Pop();
    action(); // this calls your action
}

アクションを非常に簡単に追加できます。

Queue.Add( ()=>{  /* any code you wish here */})

これは単なるヒントです。Queueクラスがあるかどうかはわかりませんが、自分で作成する(そしてスレッドセーフです!)のはかなり簡単なはずです。

回避策ははるかに賢明である可能性があります(そしてそうすべきです)が、要点はそこにあります。相談したい場合は私に書いてください。

TaskConnect開発者のPz

于 2010-05-05T16:29:59.403 に答える
2

MethodInvokerのキューを作成します

Queue<MethodInvoker> EventCall = new Queue<MethodInvoker>();

後でアイテムをキューに追加します

EventCall.Enqueue(ClearAllVals);
EventCall.Enqueue(saystuff);
EventCall.Enqueue(testFunc);

次に、関数を一度に1つずつ呼び出します。

MethodInvoker bb = EventCall.Dequeue();
bb();
bb = EventCall.Dequeue();
bb();
bb = EventCall.Dequeue();
bb();

すべての関数を安全な方法で呼び出すため(これにより、キューからすべての関数が削除され、キューが空になり、すべての関数が呼び出されます)

public bool InvokeAll(){
    MethodInvoker bb = null; // this will hold the function prior to use
    for(int i = 0; i<EventCall.count; i++){

        bb = EventCall.Dequeue(); //pull a method off of the queue
        bb(); //call the method you pulled off of the queue

    }
}

それらすべてを呼び出すには、使用するInvokeAll(); か、必要なときに一度に1つずつ呼び出します。

public bool NextEvent(){
    MethodInvoker bb = null; // this will hold the function prior to use
    if(EventCall.count > 0){

        bb = EventCall.Dequeue(); //pull a method off of the queue
        bb(); //call the method you pulled off of the queue

        } else {
        MessageBox.Show("there was no event to call"); // this is optional, point being you should be handeling the fact that there is no events left in some way.
        }
}
于 2014-11-20T00:36:35.587 に答える
1

Castleプロジェクトの一部であるDynamicProxyを使用すると、一般的なマーシャリングの問題を発生させることなく、オブジェクトメンバーを傍受できます。

http://www.castleproject.org/projects/dynamicproxy/

これを使用してメソッド呼び出しをインターセプトし、必要な処理を行うことができます。

于 2010-05-05T17:26:22.247 に答える