Event 문Event Statement

사용자 정의된 이벤트를 선언합니다.Declares a user-defined event.

구문Syntax

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

부분Parts

파트Part DescriptionDescription
attrlist 선택 사항입니다.Optional. 이 이벤트에 적용되는 특성 목록입니다.List of attributes that apply to this event. 여러 특성은 쉼표로 구분합니다.Multiple attributes are separated by commas. 특성 목록을 꺾쇠 괄호 (" < " 및 "")로 묶어야 합니다 > .You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier 선택 사항입니다.Optional. 이벤트에 액세스할 수 있는 코드를 지정합니다.Specifies what code can access the event. 다음 중 하나일 수 있습니다.Can be one of the following:

- Public-이를 선언 하는 요소에 액세스할 수 있는 모든 코드에서 액세스할 수 있습니다.- Public—any code that can access the element that declares it can access it.
- Protected-클래스 또는 파생 클래스 내의 코드만 액세스할 수 있습니다.- Protected—only code within its class or a derived class can access it.
- Friend-동일한 어셈블리의 코드만 액세스할 수 있습니다.- Friend—only code in the same assembly can access it.
- Private-이를 선언 하는 요소의 코드만 액세스할 수 있습니다.- Private—only code in the element that declares it can access it.
- 이벤트 클래스, 파생 클래스 또는 동일한 어셈블리에 있는 보호 된 Friend전용 코드를 사용 하 여 액세스할 수 있습니다.- Protected Friend-only code in the event's class, a derived class, or the same assembly can access it.
- 이벤트 클래스의 Private Protected전용 코드 또는 동일한 어셈블리의 파생 클래스에서 액세스할 수 있습니다.- Private Protected-only code in the event's class or a derived class in the same assembly can access it.
Shared 선택 사항입니다.Optional. 이 이벤트가 클래스 또는 구조체의 특정 인스턴스와 연결되지 않도록 지정합니다.Specifies that this event is not associated with a specific instance of a class or structure.
Shadows 선택 사항입니다.Optional. 이 이벤트가 기본 클래스의 이름이 같은 프로그래밍 요소 또는 오버로드된 요소 집합을 다시 선언하고 숨김을 나타냅니다.Indicates that this event redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. 모든 종류의 선언된 요소를 다른 종류로 섀도잉할 수 있습니다.You can shadow any kind of declared element with any other kind.

섀도잉된 요소는 섀도잉 요소에 액세스할 수 없는 위치를 제외하고 해당 요소를 섀도잉하는 파생 클래스 내에서 사용할 수 없습니다.A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. 예를 들어 Private 요소가 기본 클래스 요소를 섀도잉하는 경우 Private 요소에 액세스할 수 있는 권한이 없는 코드는 기본 클래스 요소에 대신 액세스합니다.For example, if a Private element shadows a base-class element, code that does not have permission to access the Private element accesses the base-class element instead.
eventname 필수 사항입니다.Required. 이벤트의 이름입니다. 표준 변수 명명 규칙을 따릅니다.Name of the event; follows standard variable naming conventions.
parameterlist 선택 사항입니다.Optional. 이 이벤트의 매개 변수를 나타내는 지역 변수 목록입니다.List of local variables that represent the parameters of this event. 매개 변수 목록을 괄호로 묶어야 합니다.You must enclose the Parameter List in parentheses.
Implements 선택 사항입니다.Optional. 이 이벤트가 인터페이스의 이벤트를 구현함을 나타냅니다.Indicates that this event implements an event of an interface.
implementslist Implements가 제공된 경우 필수입니다.Required if Implements is supplied. 구현할 Sub 프로시저 목록입니다.List of Sub procedures being implemented. 여러 프로시저는 다음과 같이 쉼표로 구분합니다.Multiple procedures are separated by commas:

구현 되는 edprocedure [, 구현 되는 edprocedure ...]implementedprocedure [ , implementedprocedure ... ]

implementedprocedure에는 다음과 같은 구문과 요소가 있습니다.Each implementedprocedure has the following syntax and parts:

interface.definednameinterface.definedname

- interface 하다.- interface - Required. 이 프로시저의 포함하는 클래스 또는 구조체에서 구현하는 인터페이스의 이름입니다.Name of an interface that this procedure's containing class or structure is implementing.
- Definedname 하다.- Definedname - Required. 프로시저가 interface에 정의되는 이름입니다.Name by which the procedure is defined in interface. 이 이름은 이 프로시저가 정의된 프로시저를 구현하는 데 사용하는 이름인 name과 동일하지 않아도 됩니다.This does not have to be the same as name, the name that this procedure is using to implement the defined procedure.
Custom 필수 사항입니다.Required. Custom으로 선언된 이벤트는 사용자 지정 AddHandler, RemoveHandlerRaiseEvent 접근자를 정의해야 합니다.Events declared as Custom must define custom AddHandler, RemoveHandler, and RaiseEvent accessors.
delegatename 선택 사항입니다.Optional. 이벤트 처리기 서명을 지정하는 대리자의 이름입니다.The name of a delegate that specifies the event-handler signature.
AddHandler 필수 사항입니다.Required. AddHandler 접근자를 선언합니다. 이 접근자는 명시적으로 AddHandler 문을 사용하거나 암시적으로 Handles 절을 사용하여 이벤트 처리기가 추가될 때 실행할 문을 지정합니다.Declares an AddHandler accessor, which specifies the statements to execute when an event handler is added, either explicitly by using the AddHandler statement or implicitly by using the Handles clause.
End AddHandler 필수 사항입니다.Required. AddHandler 블록을 종료합니다.Terminates the AddHandler block.
value 필수 사항입니다.Required. 매개 변수 이름입니다.Parameter name.
RemoveHandler 필수 사항입니다.Required. RemoveHandler 접근자를 선언합니다. 이 접근자는 RemoveHandler 문을 사용하여 이벤트 처리기가 제거될 때 실행할 문을 지정합니다.Declares a RemoveHandler accessor, which specifies the statements to execute when an event handler is removed using the RemoveHandler statement.
End RemoveHandler 필수 사항입니다.Required. RemoveHandler 블록을 종료합니다.Terminates the RemoveHandler block.
RaiseEvent 필수 사항입니다.Required. RaiseEvent 접근자를 선언합니다. 이 접근자는 RaiseEvent 문을 사용하여 이벤트가 발생될 때 실행할 문을 지정합니다.Declares a RaiseEvent accessor, which specifies the statements to execute when the event is raised using the RaiseEvent statement. 일반적으로 AddHandlerRemoveHandler 접근자에서 유지 관리하는 대리자 목록을 호출합니다.Typically, this invokes a list of delegates maintained by the AddHandler and RemoveHandler accessors.
End RaiseEvent 필수 사항입니다.Required. RaiseEvent 블록을 종료합니다.Terminates the RaiseEvent block.
delegatesignature 필수 사항입니다.Required. delegatename 대리자에 필요한 매개 변수와 일치하는 매개 변수 목록입니다.List of parameters that matches the parameters required by the delegatename delegate. 매개 변수 목록을 괄호로 묶어야 합니다.You must enclose the Parameter List in parentheses.
statements 선택 사항입니다.Optional. AddHandler, RemoveHandler, 및 RaiseEvent 메서드의 본문을 포함하는 문입니다.Statements that contain the bodies of the AddHandler, RemoveHandler, and RaiseEvent methods.
End Event 필수 사항입니다.Required. Event 블록을 종료합니다.Terminates the Event block.

설명Remarks

이벤트가 선언된 다음 RaiseEvent 문을 사용하여 이벤트를 발생시킵니다.Once the event has been declared, use the RaiseEvent statement to raise the event. 일반적인 이벤트는 다음 코드 조각에 표시된 대로 선언하고 발생시킬 수 있습니다.A typical event might be declared and raised as shown in the following fragments:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

참고

프로시저의 인수를 선언할 때처럼 이벤트 인수를 선언할 수 있습니다. 단, 이벤트에 명령된 인수, ParamArray 인수 또는 Optional 인수가 없는 경우는 예외입니다.You can declare event arguments just as you do arguments of procedures, with the following exceptions: events cannot have named arguments, ParamArray arguments, or Optional arguments. 이벤트에는 반환 값이 없습니다.Events do not have return values.

이벤트를 처리하려면 Handles 또는 AddHandler 문을 사용하여 이벤트 처리기 서브루틴에 연결해야 합니다.To handle an event, you must associate it with an event handler subroutine using either the Handles or AddHandler statement. 서브루틴 및 이벤트의 서명이 일치해야 합니다.The signatures of the subroutine and the event must match. 공유 이벤트를 처리하려면 AddHandler 문을 사용해야 합니다.To handle a shared event, you must use the AddHandler statement.

Event는 모듈 수준에서만 사용할 수 있습니다.You can use Event only at module level. 즉, 이벤트에 대 한 선언 컨텍스트 는 클래스, 구조체, 모듈 또는 인터페이스 여야 하며 소스 파일, 네임 스페이스, 프로시저 또는 블록일 수 없습니다.This means the declaration context for an event must be a class, structure, module, or interface, and cannot be a source file, namespace, procedure, or block. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준을 참조하세요.For more information, see Declaration Contexts and Default Access Levels.

대부분의 경우 이 항목의 구문 섹션에 있는 첫 번째 구문을 이벤트 선언에 사용할 수 있습니다.In most circumstances, you can use the first syntax in the Syntax section of this topic for declaring events. 그러나 일부 시나리오에서는 이벤트의 세부 동작을 더 많이 제어해야 합니다.However, some scenarios require that you have more control over the detailed behavior of the event. 이 항목의 구문 섹션에 있는 마지막 구문에서는 Custom 키워드를 사용하여 사용자 지정 이벤트를 정의할 수 있도록 함으로써 해당 제어를 제공합니다.The last syntax in the Syntax section of this topic, which uses the Custom keyword, provides that control by enabling you to define custom events. 사용자 지정 이벤트에서는 코드가 이벤트에서 이벤트 처리기를 추가하거나 제거할 때 또는 코드에서 이벤트를 발생시킬 때 수행되는 동작을 정확히 지정합니다.In a custom event, you specify exactly what occurs when code adds or removes an event handler to or from the event, or when code raises the event. 예제 는 방법: 메모리를 절약 하는 사용자 지정 이벤트 선언방법: 차단 하지 않도록 사용자 지정 이벤트 선언을 참조 하세요.For examples, see How to: Declare Custom Events To Conserve Memory and How to: Declare Custom Events To Avoid Blocking.

예제Example

다음 예제에서는 이벤트를 사용하여 10초부터 0초까지 카운트 다운합니다.The following example uses events to count down seconds from 10 to 0. 코드는 여러 가지 이벤트 관련 메서드, 속성 및 문을 보여 줍니다.The code illustrates several of the event-related methods, properties, and statements. 여기에는 RaiseEvent 문이 포함됩니다.This includes the RaiseEvent statement.

이벤트를 발생시키는 클래스는 이벤트 소스이고 이벤트를 처리하는 메서드는 이벤트 처리기입니다.The class that raises an event is the event source, and the methods that process the event are the event handlers. 이벤트 소스는 생성되는 이벤트에 대해 여러 개의 처리기를 사용할 수 있습니다.An event source can have multiple handlers for the events it generates. 클래스에서 이벤트를 발생시키면 해당 이벤트는 개체의 해당 인스턴스에 대해 이벤트를 처리하도록 선택한 모든 클래스에서 발생됩니다.When the class raises the event, that event is raised on every class that has elected to handle events for that instance of the object.

또한 이 예제에서는 단추(Button1)와 텍스트 상자(TextBox1)가 있는 폼(Form1)을 사용합니다.The example also uses a form (Form1) with a button (Button1) and a text box (TextBox1). 단추를 클릭하면 첫 번째 텍스트 상자에 10초부터 0초까지의 카운트 다운이 표시됩니다.When you click the button, the first text box displays a countdown from 10 to 0 seconds. 전체 시간(10초)이 경과되면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.When the full time (10 seconds) has elapsed, the first text box displays "Done".

Form1에 대한 코드는 폼의 초기 상태 및 최종 상태를 지정합니다.The code for Form1 specifies the initial and terminal states of the form. 또한 이벤트가 발생될 때 실행될 코드도 포함됩니다.It also contains the code executed when events are raised.

이 예제를 사용하려면 새 Windows Forms 프로젝트를 엽니다.To use this example, open a new Windows Forms project. 그런 다음 Button1이라는 단추와 TextBox1이라는 텍스트 상자를 Form1이라는 기본 폼에 추가합니다.Then add a button named Button1 and a text box named TextBox1 to the main form, named Form1. 그런 다음 폼을 마우스 오른쪽 단추로 클릭 하 고 코드 보기 를 클릭 하 여 코드 편집기를 엽니다.Then right-click the form and click View Code to open the code editor.

Form1 클래스의 선언 섹션에 WithEvents 변수를 추가합니다.Add a WithEvents variable to the declarations section of the Form1 class:

Private WithEvents mText As TimerState

Form1에 대한 코드에 다음 코드를 추가합니다.Add the following code to the code for Form1. Form_Load 또는 Button_Click과 같이 있을 수 있는 모든 중복 프로시저를 대체합니다.Replace any duplicate procedures that may exist, such as Form_Load or Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

F5 키를 눌러 이전 예제를 실행 하 고 시작이라는 레이블이 지정 된 단추를 클릭 합니다.Press F5 to run the previous example, and click the button labeled Start. 첫 번째 텍스트 상자에서 초를 카운트 다운하기 시작합니다.The first text box starts to count down the seconds. 전체 시간(10초)이 경과되면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.When the full time (10 seconds) has elapsed, the first text box displays "Done".

참고

My.Application.DoEvents 메서드는 폼과 같은 방식으로 이벤트를 처리하지 않습니다.The My.Application.DoEvents method does not process events in the same way the form does. 폼에서 이벤트를 직접 처리하도록 하려면 다중 스레딩을 사용할 수 있습니다.To enable the form to handle the events directly, you can use multithreading. 자세한 내용은 관리 되는 스레딩을 참조 하세요.For more information, see Managed Threading.

참조See also