티스토리 뷰

프로그래밍/C#

이벤트

에어버스 2022. 10. 19. 00:11

 

 

ConsoleApp2.zip
0.02MB

이벤트는 개체에 의해 발생되며, 그를 처리하기 위한 코드를 제공해야 한다는 점에서 예외와 비슷하다. 그러나 몇가지 중요한 차이들이 존재한다. 가장 중요한 차이는 이벤트에는 try...catch 에 해당하는 구조가 없다는 점이다. 이벤트의 경우에는 반드시 이벤트를 등록해야 한다. 이벤트를 등록한다는 것은 이벤트가 발생했을 때 실행될 코드를 이벤트 처리기(event handler)라는 형태로 작성한다는 의미이다.

하나의 이벤트에는 여러개의 처리기들이 등록될 수 있으며, 그 이벤트가 발생하면 등록된 모든 이벤트 처리기들이 호출된다. 이벤트 처리기는 그 이벤트를 발생시킨 개체의 클래스의 일부일 수 도 있으나, 다른 클래스들 안에 존재하는 경우가 많다.

이벤트 처리기 자체는 그냥 함수이다. 이벤트 처리기 함수의 유일한 조건은 함수의 서명이 해당 이벤트가 요구하는 서명(반환 형식과 매개변수들)과 일치해야 한다는 것이다. 이 서명은 이벤트 정의의 일부이며, 대리자에 의해 지정된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Timers;
 
namespace ConsoleApp2
{
    internal class Program
    {
        static int count = 0;
        static string displayString = "This is string will apper one letter at a time. ";
        static void Main(string[] args)
        {
            Timer myTimer = new Timer(100);
            myTimer.Elapsed += new ElapsedEventHandler(WriteChar);
            myTimer.Start();
            Console.ReadLine();
        }
 
        static void WriteChar(object source, ElapsedEventArgs e)
        {
            Console.Write(displayString[count++ % displayString.Length]);
        }
    }
}
cs

 

이벤트를 발생시키기 위해 사용한 개체는 System.Timers.Timer 클래스의 인스턴스이다.
Timer 개체에 대해 Start() 메서드를 호출하면 타이머가 시작되며, 그 메서드에 지정한 주기마다 일련의 이벤트들이 발생된다. Main() 에서는 Timer 개체의 주기를 100ms 로 설정하므로, 타이머 이후 초당 10번의 이벤트들이 발생하게 된다. (위 코드 12행)

Timer 개체는 Elpased 라는 이벤트를 발생시키는데, 개체 브라우저로 확인할 수 있다.

또는 아래 Timer 도움말(https://learn.microsoft.com/ko-kr/dotnet/api/system.timers.timer?view=netframework-4.7.2&f1url=%3FappId%3DDev16IDEF1%26l%3DKO-KR%26k%3Dk(System.Timers.Timer)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue)  에서 확인 가능하다.

이 이벤트가 요구하는 이벤트 처리기 서명은 System.Timers.ElpasedEventHandler 대리자 형식인데, 이 형식은 .Net Framework 에 정의되어 있는 표준 대리자들 중 하나이다. 이 대리자는 위 코드 18행과  같은 서명과 일치하는 함수들에 쓰인다.
Timer 개체는 자신에 대한 참조를 첫번째 매개변수로 넘겨주며, 두 번째 매개변수로는 ElapsedEventArgs 개체의 인스턴스를 넘겨준다.

20행 : Program 의 정적 필드 counter 와 displayString 을 사용해서 문자 하나씩 콘솔에 출력한다. 이 메서드가 호출될때마다 출력되는 문자가 다르다.

13행 : 이벤트 처리기 메서드를 생성한 대리자 인스턴스를 += 연산자로 타이머 개체(이벤트를 발생시킬 개체)에 추가하는 형태이다.
이 명령은 Elapsed 이벤트가 발생했을때 호출될 처리기들의 목록에 WriteChar() 를 추가하는 것이다. 처리기 목록에는 얼마든지 많은 처리기들을 등록할 수 있다. (물론, 그 처리기들은 필요한 조건들을 만족해야 한다) 이벤트가 발생하면 등록된 모든 처리기들이 호출된다.

14행 : 타이머를 시작한다.

<실행화면>

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28