12

我编写了一个高度异步的应用程序。

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

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

有人知道拦截方法调用的方法吗?为此使用透明代理/虚拟代理的某种方式?;) 服务组件?我希望这尽可能少的开销;)

4

3 回答 3

14

使用 lambdas 怎么样?

我的意思是,你为什么不创建一些队列,并以类似的方式处理它们

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

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

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

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

解决方法可能(并且应该)更明智,但要点就在那里。如果您想咨询,请写信给我。

Pz,TaskConnect 开发人员

于 2010-05-05T16:29:59.403 回答
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.
        }
}
于 2014-11-20T00:36:35.587 回答
1

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

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

您可以使用它来拦截您的方法调用,然后对它们进行您想要的处理。

于 2010-05-05T17:26:22.247 回答