2013-03-25 2 views
2

Вот моя проблема. У меня есть класс, который содержит очередь и другую форму, содержащую кнопку и список. Время от времени пользователь открывает форму и должен получить все накопленные объекты из очереди и показать их в списке. После закрытия формы данные будут накапливаться снова. Пока форма открыта, как только получатель получает элемент, он должен уведомить открытую форму нового элемента через настраиваемое событие. Я уже все это сделал. Моя проблема в следующем. Как только форма будет подписана на событие уведомления, она должна сбросить всю очередь в форму и сохранить ее, если кто-то подписался на это событие. Когда форма закрывается и подписка заканчивается, она должна накапливаться.Событие запуска после подписки

Одним из решений было бы использовать таймер, чтобы проверить, есть ли какие-либо подписки на событие, а затем сбрасывать его. Это не так много, но я буду тратить ресурсы на таймер. Для меня было бы намного лучше, если бы было возможно, что подписка форм на событие из другого класса может вызвать событие в другом классе. Что-то вроде события на мероприятии. Поскольку событие также является объектом, должно быть возможно выполнить что-то подобное, но мне не удалось найти какие-либо ссылки.

Каждый получил предложение

+2

Вы можете оставить здесь свой код. – Tomtom

+0

Не используйте таймер. Просто инициализируйте список из очереди. Используйте событие только для добавления новых элементов очереди. –

+0

слишком много и слишком много осложнений для добавления кода. – user853710

ответ

2

Вы можете настроить добавление и удаление обработчиков событий в коде само мероприятие, используя заявления add и remove:

private EventHandler onMyEvent; 
public event MyEventHandler MyEvent 
{ 
    add 
    { 
     // run when event handler is added (+=) 
     onMyEvent = (MyEventHandler)Delegate.Combine(onMyEvent, value); 
    } 

    remove 
    { 
     // run when event handler is removed (-=) 
     onMyEvent = (MyEventHandler)Delegate.Remove(onMyEvent, value); 
    } 
} 

Здесь вы можете добавить свой собственный код для активации действий при добавлении или удалении обработчика событий.

+0

Я думаю, что это может быть именно то, что я искал. – user853710

+0

Это может также решить некоторые другие проблемы, а также уменьшить количество тонны кода в другом месте. Спасибо – user853710

+0

Возможно ли получить объект, подписанный на мероприятие, в аксессуре добавления? – user853710

0

Для таймера ваш может попробовать с этим кодом

private static System.Timers.Timer aTimer; 

    aTimer = new System.Timers.Timer(10000); 

    // Hook up the Elapsed event for the timer. 
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

    // Set the Interval to 2 seconds (2000 milliseconds). 
    aTimer.Interval = 2000; 
    aTimer.Enabled = true; 

Ваша функция

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     //Your treatment 
    } 
+1

таймеры быстрое и грязное решение. если я начну использовать их каждый раз, когда это будет сложно, со временем приложение сильно раздуется. – user853710

+0

o i inderstand ваши технические потребности –

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