Может кто-нибудь объяснить этот синтаксис передачи событий / методов в C #? - PullRequest
0 голосов
/ 16 мая 2018

Этот вопрос, вероятно, задавался много, главное в моем вопросе (и, следовательно, отчасти из-за того, что я его публикую) состоит в том, что я не знаю, как вообще называется этот формат / синтаксис, и поэтомупонятия не имею, что искать.Для справки я приложил пример данного типа кода.В этом примере Timer использует синтаксис / функциональность, которую я не полностью понимаю, но я видел этот тип синтаксиса, используемый в других контекстах.Моя цель - я хотел бы экстраполировать / понять / использовать эту функциональность в общем контексте (необязательно используя таймер).Я понимаю, как код работает функционально, каждые 2 секунды (приблизительно) таймер активирует «OnTimedEvent», и этот метод выводит информацию о событии (как показано в нижней части этого поста).Из того, что я понимаю, мой таймер («aTimer») является объектом, и в нем есть такие переменные, как «autoreset» и «Enabled», которые являются значениями bools, устанавливаемыми в коде как «true».

Это сложно сформулировать, но я не понимаю синтаксис / как это работает.Например, я вижу «aTimer.Elapsed + = OnTimedEvent» и вижу, что результат «OnTimedEvent» вызывается, когда происходит событие «Elapsed».Проблема в том, что я не понимаю его бэк-энда, поэтому не знаю, как применить это к другому коду, с которым я работаю.

  • Что делает "+ ="?Это прикрепление метода, который будет вызываться всякий раз, когда происходит событие?Это порождается в том же потоке, что и событие, и можно ли вызывать несколько методов таким образом (например, делать Elapsed + = ArbitrarySecondMethod), или это переопределяет некоторый ответ / метод, который по умолчанию связан с «Elapsed»?Что будет даже ответом по умолчанию?
  • В «OnTimedEvent» как «источник» и прошедшие события фактически передаются ему?
  • Я не вижу, как e.SignalTime даже проходит стадию компиляции.Как бы «OnTimedEvent» даже узнал, что объект Timer существует?
  • Кроме того, с параметрами, передаваемыми в «OnTimedEvent», является то, что (Object x, Args y) стандартный формат, используемый в такой ситуации, что я хотел бы узнать, чтобы узнать больше о том, как использовать эти типыдополнительных методов (в общем контексте)

Код / синтаксис в вопросе:

(Извините, чтоформат нечетный, но я хотел убедиться, что я выделил конкретные части, которые я хочу понять)

{

aTimer.Elapsed + = OnTimedEvent;

}

частная статическая пустота OnTimedEvent (Источник объекта, ElapsedEventArgs e)

{

Console.WriteLine ("Событие Elapsedбыло поднято в {0: ЧЧ: мм: сс.ффф} ", e.SignalTime );

}

Полная программа для справки:

class Program
{
    private static System.Timers.Timer aTimer;

    public static void Main()
    {
        SetTimer();

        Console.WriteLine("\nPress the Enter key to exit the application...\n");
        Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
        Console.ReadLine();
        aTimer.Stop();
        aTimer.Dispose();

        Console.WriteLine("Terminating the application...");
    }

    private static void SetTimer()
    {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}

Код отображает вывод следующим образом:

//       Press the Enter key to exit the application...
//
//       The application started at 09:40:29.068
//       The Elapsed event was raised at 09:40:31.084
//       The Elapsed event was raised at 09:40:33.100
//       The Elapsed event was raised at 09:40:35.100
//       The Elapsed event was raised at 09:40:37.116
//       The Elapsed event was raised at 09:40:39.116
//       The Elapsed event was raised at 09:40:41.117
//       ....(you get the point)
//       Terminating the application...

1 Ответ

0 голосов
/ 16 мая 2018

Поток:

create aTimer
find Main()
run SetTimer
init aTimer to 2000 milliseconds
set elapsed event to OnTimerEvent
set aTimer to auto reset
set aTimer enabled = true (Start the timer counting)
console write: Press enter to quit.
console write: App started at.
Wait for console input Return key. -This "pauses" the app.
stop aTimer
dispose aTimer
console write: Terminating

Что делает "+ ="?

Добавляет вызов метода в стек событий.

Isон присоединяет метод, который будет вызываться при возникновении события?

Да, технически он добавляется в список методов, вызываемых при возникновении события.

Является ли это порожденнымв том же потоке, что и событие

Да

, и могут быть вызваны несколько методов таким образом (например, Elapsed + = ArbitrarySecondMethod)

Да, вы можете сказать: Elapsed + = FirstThing;Прошло + = SecondThing;и т.д ....

или это переопределяет какой-то ответ / метод, который по умолчанию связан с "Истек"?

Нет, это аддитивно.

Каким будет ответ по умолчанию?

Ничего, как кнопка без нее Нажмите даже назначенный.

Как в «OnTimedEvent» как на самом деле передаются «источник» и прошедшие события?

Как и любой делегат, объект, который его вызвал,отправляется как «отправитель» вместе с новым экземпляром любого класса eventargs, который использует событие.Когда вы назначаете метод с помощью + =, он проверяет, совпадает ли сигнатура метода с этим шаблоном (объект, EventArg какого-то вида )

Я не вижу, как 'e.SignalTime 'даже проходит этап компиляции.

Поскольку он является частью класса ElapsedDEventArgs.Обратите внимание на прошедшее в передней части этого.Это не класс EventArgs по умолчанию, но что-то унаследованное от него, с большим количеством вещей.Этот дополнительный материал заполняется таймером, когда он запускает событие.

Как бы "OnTimedEvent" даже узнал, что объект Timer существует?

На самом деле это не так.Он просто знает, что ожидает получить Object thing и ElapsedEventArgs thing .

Кроме того, параметры передаются в OnTimedEvent,в том, что (Object x, Args y) стандартный формат, используемый в такой ситуации

Да, вы найдете большинство, если не все обработчики событий .Net, ожидающие такого рода сигнатуры.Всегда сначала отправитель объекта, а затем какой-то объект EventArg.Этот объект arg события будет меняться в зависимости от события, на которое он подписан.Библиотека MSDN должна показать вам, что вам нужно.

, что бы я посмотрел, чтобы узнать больше о том, как использовать эти типы дополнительных методов (в общем контексте)

Это простые методы событий, поэтому все, что говорит о .Net-событиях, пойдет на это.Более подробные сведения см .:

События MS Docs

Шаблоны событий MS Docs

Руководство по событиям MS Docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...