Использование EventHandler C# .NET

112
13 октября 2019, 16:30

Помогите пожалуйста разобраться в применении EventHandler. Я написал для проверки простую консольную программу:

internal class Program
{
    private class EventTest
    {
        private string Action { get; set; }
        private string Name { get; set; }
        public event EventHandler GeneralEventHandler;
        public EventTest()
        {
            Count();
        }
        private void Count()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                Action = $"Action {i}";
                Name = $"Name {i}";
                //Console.WriteLine($"{Action}\n{Name}"); //Для проверки
                CustomHandler(Action, new EventArgs());
            }
        }
        private void CustomHandler(object sender, EventArgs e)
        {
            GeneralEventHandler?.Invoke(this, e);
        }
    }
    private static void Main(string[] args)
    {
        var events = new EventTest();
        //events.Count();
        events.GeneralEventHandler += Events_GeneralEventHandler;
        Console.ReadKey();
    }
    private static void Events_GeneralEventHandler(object sender, EventArgs e)
    {
        Console.WriteLine(sender.ToString());
        Console.WriteLine(e.ToString());
    }
}

Не работает, и вообще правильно ли так делать. Так же не могу получить доступ к свойствам например:

sender.Action
e.Action;

Хотелось бы обойтись без кастомного события:

 internal class Program
{
    public class MyEvents : EventArgs
    {
        public string Action { get; set; }
        public string DriveName { get; set; }
        public MyEvents(string action, string driveName)
        {
            Action = action;
            DriveName = driveName;
        }
    }
    public class EventTest
    {
        public string Action { get; set; }
        private string Name { get; set; }
        public event EventHandler GeneralEventHandler;
        public delegate void MessageReceivedEventHandler(MyEvents args);
        public event MessageReceivedEventHandler MessageReceived;
        public EventTest()
        {
        }
        public void Count()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                Action = $"Action {i}";
                Name = $"Name {i}";
                //Console.WriteLine($"{Action}\n{Name}");
                OnMessageReceived(new MyEvents(Action, Name));
            }
        }
        protected virtual void OnMessageReceived(MyEvents args)
        {
            MessageReceived?.Invoke(args);
        }
    }
    private static void Main(string[] args)
    {
        var events = new EventTest();
        events.Count();
        //events.GeneralEventHandler += Events_GeneralEventHandler;
        events.MessageReceived += Events_MessageReceived;
        Console.ReadKey();
    }
    private static void Events_MessageReceived(MyEvents args)
    {
        Console.WriteLine(args.Action);
    }

В такой реализации все работает нормально... Можно ли это сделать через EventHandler передав в Invoke this?

READ ALSO
C++ CLR/CLI array of array&lt;Byte&gt;

C++ CLR/CLI array of array<Byte>

Собственно какой правильный синтаксис у 2D array?

140
Как вызвать диалоговое окно и указать путь к файлу?

Как вызвать диалоговое окно и указать путь к файлу?

В данный момент для прочитывания файла используется StremReader

127
OutOfMemoryException

OutOfMemoryException

У меня есть метод в классе, который создает список моих линийКоличество точек в одной линии может достигать 1700000 и больше

132
подключение к базам данных на c#

подключение к базам данных на c#

Есть база данных к которой подключается приложение через формуНа Форме есть textbox куда необходимо вписать параметры подключения к базе так...

118