[prg] Re: События в C#
Здравствуйте.
17.12.2018 5:40, Кирилл пишет:
> Привет уважаемому собранию.
>
>
> Никак не разберусь с событиями. Покажите, плз, конкретный пример кода (с
> краткими комментариями) для C#. Есть переменная int i. Нужно, чтобы
> когда в переменной появлялось определённое значение, скажем, 5,
> срабатывало событие, скажем, проигрывался звук Console.Beep(3000,250).
> Как отслеживать изменения этой переменной?
Вообще суть в том, что событие вызывается методом, который изменяет само
значение переменной.
Далее пример от сюда:
https://docs.microsoft.com/ru-ru/dotnet/api/system.eventhandler?view=netframework-4.7.2
public class ThresholdReachedEventArgs : EventArgs // класс
унаследованный от EventArgs , в котором передаются параметры события, в
данном случае пороговое значение и время, в вашем случае это могло быть
значение переменной i
{
public int Threshold { get; set; }
public DateTime TimeReached { get; set; }
}
class Counter //класс в котором происходит какое-то событие
{
public event EventHandler<ThresholdReachedEventArgs>
ThresholdReached; // событие на которое будут подписываться получатели и
которое будет вызываться при добавлении значения
private int threshold;
private int total;
public Counter(int passedThreshold)
{
threshold = passedThreshold;
}
public void Add(int x) // метод, где добавляется значение и
вызывается событие
{
total += x;
if (total >= threshold) // если total превышает какой-то
порог вызвать событие
{
ThresholdReachedEventArgs args = new
ThresholdReachedEventArgs(); // создаем объект класса
ThresholdReachedEventArgs , определенного выше, и заполняем его значениями
args.Threshold = threshold;
args.TimeReached = DateTime.Now;
OnThresholdReached(args); // вызываем метод вызывающий
само событие и передаем ему данные
}
}
protected virtual void
OnThresholdReached(ThresholdReachedEventArgs e) // метод вызывающий событие
{
EventHandler<ThresholdReachedEventArgs> handler =
ThresholdReached;
if (handler != null) // проверяет делегат события на null и
вызывает его
{
handler(this, e);
}
}
Дальше вы можете подписываться на это событие следующим образом:
class Program
{
static void Main(string[] args)
{
Counter c = new Counter(new Random().Next(10)); // Создаем
экземпляр класса Counter
c.ThresholdReached += c_ThresholdReached; // подписываемся на событие
ThresholdReached
}
static void c_ThresholdReached(object sender,
ThresholdReachedEventArgs e) // метод, который будет вызываться, когда
срабатывает событие
{
Console.WriteLine("The threshold of {0} was reached at
{1}.", e.Threshold, e.TimeReached);
Environment.Exit(0);
}
}
--
С уважением, Константин.