Вы можете использовать установщик свойств, чтобы вызывать событие всякий раз, когда значение поля собирается измениться.
У вас может быть собственный делегат EventHandler или известный делегат System.EventHandler.
Обычно для этого есть шаблон:
- Определите общедоступное событие с помощью делегата обработчика событий (имеющего аргумент типа EventArgs).
- Определите защищенный виртуальный метод с именем OnXXXXX (например, OnMyPropertyValueChanged). В этом методе вы должны проверить, является ли делегат обработчика событий нулевым, и если нет, вы можете его вызвать (это означает, что к делегированию события прикреплены один или несколько методов).
- Вызывайте этот защищенный метод всякий раз, когда вы хотите уведомить подписчиков о каких-либо изменениях.
Вот пример
private int _age;
//#1
public event System.EventHandler AgeChanged;
//#2
protected virtual void OnAgeChanged()
{
if (AgeChanged != null) AgeChanged(this,EventArgs.Empty);
}
public int Age
{
get
{
return _age;
}
set
{
//#3
_age=value;
OnAgeChanged();
}
}
Преимущество этого подхода состоит в том, что вы позволяете любым другим классам, которые хотят наследовать от вашего класса, при необходимости изменять поведение.
Если вы хотите поймать событие в другом потоке, который вызывается, вы должны быть осторожны, чтобы не изменить состояние объектов, которые определены в другом потоке, что приведет к возникновению исключения между потоками. Чтобы избежать этого, вы можете использовать метод Invoke для объекта, состояние которого вы хотите изменить, чтобы убедиться, что изменение происходит в том же потоке, в котором возникло событие, или в случае, если вы имеете дело с формой Windows Form, которую вы можно использовать BackgourndWorker, чтобы легко и просто выполнять задачи в параллельном потоке.