排队方法调用 - 任何想法如何?

时间:2010-05-05 16:05:50

标签: c# transparentproxy

我写了一个非常不同步的应用程序。

我正在寻找一种排队方法调用的方法,类似于BeginInvoke / EndInvoke所做的....但是在我的OWN队列上。 reaqson是我使用线程池拥有自己的优化消息排队系统,但同时确保每个组件在请求中都是单线程的(即一个线程只处理组件的消息)。

我有很多消息来回传递。对于有限的使用,我真的很想能够只使用参数对消息调用进行排队,而不是必须定义我自己的参数,方法包装/解包只是为了进行大量的管理调用。我也不总是想绕过队列,我绝对不希望发送服务等待其他服务响应。

任何人都知道拦截方法调用的方法吗?为此利用TransparentProxy / Virtual Proxy的一些方法? ;)ServicedComponent?我希望这个开销尽量少;)

3 个答案:

答案 0 :(得分:13)

如何使用lambdas?

我的意思是,你为什么不创建一些队列,并以像

这样的方式处理它们
while (!queue.Empty) 
{
    Action action = queue.Pop();
    action(); // this calls your action
}

您可以非常简单地添加操作:

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

这只是一个提示,我不确定是否有一些Queue类,但是自己创建一个(和线程安全!)应该非常简单。

解决方法可以(并且应该)更加明智,但重点是存在。如果你想咨询,请写信给我。

Pz,TaskConnect开发人员

答案 1 :(得分:2)

创建MethodInvoker的队列

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

稍后将项目添加到您的队列

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

然后一次调用一个函数:

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();来调用它们,或者只要你想要一次调用它们:

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.
        }
}

答案 2 :(得分:1)

作为Castle项目一部分的DynamicProxy允许对象成员拦截而没有一些典型的编组痛苦

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

您可以使用它拦截方法调用,然后根据需要使用它们。