Как добавить обработчик событий в c #?

#c# #events #delegates

#c# #Мероприятия #делегаты

Вопрос:

Я совершенно новичок в событиях и делегатах в C #. Я хочу обработать событие чтения данных в одном классе (например, program), а чтение порта выполняется в другом классе (например, transfer). Я знаю, как это сделать только с делегатами, но не знаю, как это сделать в events.

Не могли бы вы дать мне простой пример. Спасибо.

Комментарии:

1. Я почти уверен, что у Microsoft есть образцы для этого.

2. Привет — обычно вы просто «добавляете» обработчик к событиям, подобным Button.Click = OnButtonClickedHandler; — НО с чем вы работаете (например, с программой)? Вы хотите обрабатывать события в процессах / программах?

Ответ №1:

посмотрите на этот пример

     public class TimerManager : INotifyPropertyChanged
    {
    private readonly DispatcherTimer dispatcherTimer;
    private TimeSpan durationTimeSpan;
    private string durationTime = "00:00:00";
    private DateTime startTime;
    private bool isStopped = true;
    readonly TimeSpan timeInterval = new TimeSpan(0, 0, 1);
    public event EventHandler Stopped;

    public TimerManager()
    {
        durationTimeSpan = new TimeSpan(0, 0, 0);
        durationTime = durationTimeSpan.ToString();
        dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick  = DispatcherTimerTick;
        dispatcherTimer.Interval = timeInterval;
        dispatcherTimer.IsEnabled = false;
        DefaultStopTime = new TimeSpan(17, 30, 0);

    }

    public TimerManager(TimeSpan defaultStopTime)
        : this()
    {
        DefaultStopTime = defaultStopTime;
    }
    #region Properties

    public TimeSpan ElapsedTime
    {
        get { return durationTimeSpan; }
    }
    public string DurationTime
    {
        get { return durationTime; }
        set
        {
            durationTime = value;
            OnPropertyChanged("DurationTime");
        }
    }

    public DateTime StartTime
    {
        get { return startTime; }

    }
    public bool IsTimerStopped
    {
        get
        {
            return isStopped;
        }
        set
        {
            isStopped = value;
            OnPropertyChanged("IsTimerStopped");
        }
    }

    public TimeSpan DefaultStopTime { get; set; }

    #endregion

    #region Start Stop Timer

    public void StartTimer()
    {
        dispatcherTimer.Start();
        durationTimeSpan = new TimeSpan(0,0,0);
        startTime = DateTime.Now;
        IsTimerStopped = false;
    }

    public void StopTimer()
    {
        dispatcherTimer.Stop();
        IsTimerStopped = true;
        if (Stopped != null)
        {
            Stopped(this, new EventArgs());
        }
    }

    #endregion


    public void DispatcherTimerTick(object sender, EventArgs e)
    {
       // durationTimeSpan = DateTime.Now - startTime;
       durationTimeSpan = durationTimeSpan.Add(timeInterval);
        DurationTime = string.Format("{0:d2}:{1:d2}:{2:d2}", durationTimeSpan.Hours, durationTimeSpan.Minutes,
                                     durationTimeSpan.Seconds);
        if (DateTime.Now.TimeOfDay >= DefaultStopTime)
        {
            StopTimer();
        }

    }


}
  

в этом классе у нас есть событие остановки таймера

         public event EventHandler Stopped;
  

в методе мы вызываем обработчик событий, если он не равен null

 public void StopTimer()
{
    dispatcherTimer.Stop();
    IsTimerStopped = true;
    if (Stopped != null)
    {
       //call event handler
        Stopped(this, new EventArgs());
    }
}
  

для использования этого класса и события остановки таймера посмотрите на код

      var timer = new TimerManager();
     timer.Stopped  = TimerStopped;
     void TimerStopped(object sender, EventArgs e)
     {
        // do you code
     }
  

Ответ №2:

Если я правильно понял, о чем вы просите, вы можете сделать что-то вроде этого:

 public class MyClass
{
  ...
  public  void delegate MuCustomeEventDelegate( ...params...);
  public event MuCustomeEventDelegate MuCustomeEvent;

  ...
}