2012-05-23 2 views
3

Я написал класс под названием QueueManager:C# очереди создания функции

class QueueManager 
{ 
    Queue functionsQueue; 

    public bool IsEmpty 
    { 
     get 
      { 
       if (functionsQueue.Count == 0) 
        return true; 
       else 
        return false; 
      } 
    } 

    public QueueManager() 
    { 
     functionsQueue = new Queue(); 
    } 

    public bool Contains(Action action) 
    { 
     if (functionsQueue.Contains(action)) 
      return true; 
     else 
      return false; 
    } 

    public Action Pop() 
    { 
     return functionsQueue.Dequeue() as Action; 
    } 

    public void Add(Action function) 
    { 
     functionsQueue.Enqueue(function); 
    } 

    public void Add(Func<CacheObject,Boolean> function) 
    { 
     functionsQueue.Enqueue(function); 
    } 

и когда я создаю экземпляр этого класса и вызвать метод Add он отлично работает для функций без аргументов, например: functionQueue. Добавить (метод); , но при вызове методов с аргументом и возвращаемым значением (в моем случае ClassType в качестве аргумента и Boolean как возвращаемое значение), например functionQueue.Add (Method2 (classObject)); он не компилируется, что мне не хватает?

+2

Посмотрите здесь: http://stackoverflow.com/questions/4317479/func-vs-action-vs-predicate – CodeCaster

ответ

12

Потому что с functionQueue.Add(Method2(classObject)) вы ставите в очередь результат вашего вызова, а не сам вызов.

Чтобы установить метод с параметрами, вы должны изменить прототип Add, чтобы принять параметры (и сохранить их вместе с делегатом). В качестве альтернативы вы можете использовать лямбды:

functionQueue.Add(() => Method2(classObject)); 

(тогда ваша вторая перегрузка Add бесполезно, вы всегда можете поставить в очередь в Action, где вы даете все параметры внутри закрытия).

Обновление
Пример очереди этого типа внутри WinForms, диспетчеризация методов из других нитей, чем основной поток осуществляется с помощью очереди на метод (смотреть на разборки Control.MarshaledInvoke). Пропуск синхронизации и контекстов содержит System.Collections.Queue, где каждая запись ThreadMethodEntry (структура, используемая для хранения необходимых данных).

+3

Ничего себе .. это на самом деле имеет смысл..aaand it works: D .. thanks: D – Fazi

Смежные вопросы