Подтвердить что ты не робот

Способы вызова в очереди - любая идея как?

Я пишу сильно асинхронное приложение.

Я ищу способ вызова вызовов в очередь, аналогично тому, что BeginInvoke/EndInvoke делает... но в моей OWN-очереди. Reaqson заключается в том, что у меня есть собственная оптимизированная система очередей сообщений, использующая threadpool, но в то же время убедившись, что каждый компонент является однопоточным в запросах (т.е. Один поток обрабатывает сообщения только для компонента).

У меня много сообщений, идущих туда и обратно. Для ограниченного использования мне бы очень хотелось иметь возможность просто поставить очередь сообщений с параметрами, вместо того, чтобы определять свой собственный параметр, обертывать/разворачивать метод только ради того, чтобы делать много адмистративных вызовов. Я также не всегда хочу обойти очередь, и я определенно не хочу, чтобы служба отправки ожидала ответа другой службы.

Кто-нибудь знает способ перехвата вызова метода? Какой-то способ использовать TransparentProxy/Virtual Proxy для этого?;) ServicedComponent? Я хотел бы, чтобы это было как можно меньше накладных;)

4b9b3361

Ответ 1

Как насчет использования lambdas?

Я имею в виду, почему бы вам не создать некоторую очередь и обработать их так, как

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

Вы можете добавлять действия очень просто:

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

Это всего лишь подсказка, я не уверен, есть ли какой-то класс Queue, но это должно быть довольно просто создать один (и threadafe!) самостоятельно.

Обходной путь может (и должен) быть намного мудрее, но главное. Напишите мне, если вы хотите проконсультироваться.

Pz, разработчик TaskConnect

Ответ 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.
        }
}

Ответ 3

DynamicProxy, являющийся частью проекта Castle, позволяет перехватывать объект-член без какой-либо типичной боли в маршаллинге.

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

Вы можете использовать это, чтобы перехватывать вызовы методов, а затем делать с ними то, что вы хотите.