이벤트 처리 및 올리기

참조 : HTTPS : //docs.microsoft.com/zh-cn/dotnet/standard/events/index보기 = netframework-4.8?

제목 : 취급 및 모금 이벤트

 

.NET 이벤트는 위임 모델을 기반으로. 위임 모델은 다음과 관찰자 디자인 패턴을 그 가입자가 공급자로 등록하고 알림을받을 수 있습니다. 이벤트 통지 발신자 푸시 이벤트는 이벤트 수신기는 상기 통지를 수신하고, 그 정의에 응답하여 발생한다. 이 문서에서는 코드에서 이벤트를 구현하는 응용 프로그램 및 방법에 이벤트를 사용하는 방법을 위임 모델의 주요 구성 요소에 대해 설명합니다.

윈도우 8.x의 저장 응용 프로그램에서 이벤트 처리에 대한 자세한 내용은 다음을 참조 행사 및 라우트 된 이벤트 개요 .

활동

이벤트 전송 오브젝트 조작 신호에 의해 전송 된 메시지이다. 이 조작 버튼을 클릭하는 것과 같은 사용자 상호 작용에 의해 발생 될 수있다 또한 특성 값을 변경하는 등의 일부 다른 논리 프로그램에 의해 발생 될 수있다. 이벤트를 제기 개체 "이벤트 보낸 사람"이라고합니다. 이벤트 송신자는 발생하는 이벤트 (과정)를 수신 할 객체 나 방법을 알지 못합니다. 이벤트는 예를 들어, 일반적으로 이벤트 보낸 사람의 구성원  클릭  이벤트가 있습니다  버튼  , 클래스 멤버를 하여 PropertyChanged  이벤트를 달성하는 것입니다  에서 INotifyPropertyChanged  인터페이스 클래스의 멤버를.

이벤트를 정의하려면 이벤트 클래스 서명을 사용할 수 있습니다  event(C #에서) 또는  Event키워드 (Visual Basic의 경우), 그리고 이벤트 대리자 형식을 지정합니다. 다음 섹션에서 의뢰했다.

일반적으로, 인상 이벤트에, 당신은 C #으로 마크를 추가 할 수 있습니다  protected 와  virtual 나에 대한 Visual Basic에서 표시  Protected 및  Overridable방법. 이 방법이라는  OnEventName을 , OnDataReceived예를 들면 이 방법은 소정의 이벤트 데이터 객체를 수신한다 ( 는 EventArgs  형 또는 유도 형 파라미터)이다. 이 방법은 이벤트의 발사 논리를 무시하는 파생 클래스있게 제공합니다. 파생 클래스는 항상 기본 클래스를 호출해야  OnEventName을에  등록 된 대리자가 이벤트를받을 수 있도록 방법을.

다음 예제 프로그램은 어떻게 이름을 선언하는  ThresholdReached 이벤트를. 이벤트  핸들러의  동료와의 의뢰로  OnThresholdReached 개시하는 방법.

클래스 카운터 
{ 
    공공  이벤트 핸들러가 ThresholdReached; 

    보호  가상  공간은 (있는 EventArgs e)를 OnThresholdReached 
    { 
        핸들러 핸들러 = ThresholdReached; 
        핸들러 ? .Invoke ( , E); 
    } 

    // 클래스의 나머지 구현을 제공 
}

 

맡기다

대리자 저장된 기준 방식의 일종이다. 대리자 반환 형식과 매개 변수 서명 문을 표시하는 방법으로 참조하고, 자신의 서명이 참조 방법을 일치하는 경우에만 저장할 수 있습니다. 따라서,위원회는 유형 안전 함수 포인터 또는 콜백 동등하다. 위임 선언은 대리자 형식을 정의하기에 충분하다.

위원회는 .NET에 많은 사용이 있습니다. 이벤트의 문맥에서, 이벤트 소스 및 코드 사이의 중간 위임 처리하는 이벤트 (포인터 또는 유사한 메커니즘). 예로서, 관련 이벤트 타입에 대한 이벤트 및 대리자가 위임 선언 캔을 포함한다. 위임에 대한 자세한 내용은  위임  클래스를.

.NET이 제공하는  이벤트 핸들러  와  이벤트 핸들러 <TEventArgs>  이벤트 장면의 대부분을 지원하기 위해 의뢰를. 사용  이벤트 핸들러의  대표는 모든 이벤트는 이벤트 데이터를 포함하지 않는 처리합니다. 사용  이벤트 핸들러 <TEventArgs은>  핸들 이벤트에 위임 이벤트 관련 데이터를 포함한다. 대리자 형식을 반환하고 두 개의 매개 변수 (대상 이벤트 소스 데이터 객체 및 이벤트)을 소요하지 않습니다.

대표단은 멀티 캐스트 가 여러 이벤트에 대한 참조 처리를 절약 할 수 있습니다 의미한다. 자세한 내용은  위임  참조 페이지를. 이벤트 처리의 유연성과 정밀한 제어를 제공하기 위해 의뢰. 등록 된 이벤트 핸들러에서의 주요 이벤트를 유지하여 이벤트 발생 이벤트 발송자의 일종으로서 작용한다.

에서  이벤트 핸들러  와  이벤트 핸들러 <TEventArgs>  장면을 사용할 수없는 의뢰, 당신은 대리인을 정의 할 수 있습니다. 당신이 코드는 일반적인 인식되지 않을 때 처리해야 할 때, 예를 들어, 위임 장면은 매우 드문 정의 할 필요합니다. 성명에서 사용  delegate하고 (C #에서)  Delegate(Visual Basic의 경우) 의뢰 키워드 태그. 다음 예제 프로그램은 어떻게 선언하는  ThresholdReachedEventHandler 대리자를.

공개  대리인  보이드 ThresholdReachedEventHandler ( 오브젝트 송신자 ThresholdReachedEventArgs E);

 

이벤트 데이터

이벤트와 연관된 이벤트 데이터는 데이터 클래스에 의해 제공 될 수있다. .NET은 이벤트 데이터 클래스의 수를 제공, 당신은 당신의 자신의 응용 프로그램에서 사용할 수 있습니다. 예를 들어, SerialDataReceivedEventArgs  클래스입니다  SerialPort.DataReceived  이벤트 데이터 클래스 이벤트. 모든 이벤트 데이터 클래스에 따라 .NET  EventArgs 명명 방식의 끝. 어떤 이벤트 데이터 이벤트와 연관된 클래스 당신은 이벤트를 보려면위원회에 의해 결정된다. 예를 들어, SerialDataReceivedEventHandler의  대리자 포함  SerialDataReceivedEventArgs  매개 변수 중 하나로서 클래스.

있는 EventArgs  클래스는 모든 이벤트 데이터 클래스의 기본 유형입니다. 이벤트와 연관된 모든 데이터를 가지고 있지 않을 때, 당신은 사용할 것이다  있는 EventArgs  클래스를. 당신은 다른 수준의 문제를 알려에만 이벤트를 만들 때 포함하여 모든 데이터를 전달 할 필요가 없습니다  있는 EventArgs  두 번째 매개 변수의 대리자로 클래스입니다. 데이터가 제공되지 않은 경우, 당신은 통과 할 수  EventArgs.Empty의  값입니다. 핸들러  포함 대리자  있는 EventArgs  파라미터로서 클래스.

당신은 사용자 지정 이벤트 데이터 클래스를 생성에서 파생하는 클래스를 생성 할 때  있는 EventArgs  클래스는, 모든 구성원이 이벤트와 관련된 데이터를 전송하는 데 필요합니다. 일반적으로, .NET은 같은 명명 방식을 사용하고, 이벤트 데이터 클래스 이름이되어야  EventArgs 끝난다.

다음 예는 이름이 표시  ThresholdReachedEventArgs 이벤트 데이터 클래스를. 그것은 트리거 이벤트 속성의 특정이 포함되어 있습니다.

공공  클래스 ThresholdReachedEventArgs : EventArgs입니다 
{ 
    공공  INT의 임계 값은 { 얻을 ; 설정 ; }
     공공 날짜 시간 TimeReached { GET ; 설정 ; } 
}

이벤트 처리기

이벤트에 응답하기 위해 이벤트 싱크 이벤트 핸들러 메소드를 정의 할 필요가있다. 이 방법은 처리중인 당신의 대리인이 서명 이벤트를 일치해야합니다. 이벤트는 사용자가 버튼을 클릭 한 후 사용자의 입력을 수집으로, 원하는 동작을 수행 발생되는 이벤트 핸들러. 이벤트가 발생할 때 알림을받을 경우, 이벤트 핸들러 메서드는 이벤트에 가입해야합니다.

다음 예제의 표시  c_ThresholdReached 특성은 위임 일치  핸들러  이벤트 핸들러 방법. 방법 가입  ThresholdReached 이벤트입니다.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        var에 C = 새로운 카운터 (); 
        c.ThresholdReached + = c_ThresholdReached; 

        //이 클래스에 대한 구현을 제공 잔존 
    } 

    정적  무효 c_ThresholdReached ( 오브젝트 송신자있는 EventArgs e)를 
    { 
        Console.WriteLine ( " 임계 값에 도달 하였다. " ); 
    } 
}

 

정적 및 동적 이벤트 핸들러

.NET과 함께, 가입자는 정적 또는 동적 등록 이벤트 알림을받을 수 있습니다. 정적 이벤트 핸들러에 의해 처리를위한 동급 이벤트의 전체 수명주기에 대한 유효 이벤트 핸들러하십시오. 일반적으로 어떤 프로그램 로직 조건에 따라 동적으로 프로그램 실행시 명시 적으로 활성화 및 비활성화 이벤트 핸들러입니다. 이벤트 통지는 특정 조건 하에서 만 필요한 경우 응용 프로그램이 이벤트 핸들러와 이벤트 핸들러 실행의 복수를 제공하는 경우 예를 들어, 또는 제대로 동적 이벤트 핸들러를 사용할 수있는 조건이 사용되도록 정의. 예 중 하나에 동적으로 이벤트 처리기를 추가하는 방법을 보여줍니다. 자세한 내용은에서 Visual Basic에서 볼 이벤트 및 C #의에서 이벤트 .

여러 이벤트를 시작합니다

클래스는 여러 이벤트를 제기하는 경우, 컴파일러는 필드를 생성하는 각 이벤트 인스턴스에 의뢰됩니다. 많은 수의 이벤트 경우에는 위임 스토리지 비용에 의해 계산 된 필드를 받아 들일 수 없습니다. 이러한 경우에, .NET 이벤트 속성을 제공하며, 그것은 함께 저장된 상기 선택된 이벤트 대리자 또 다른 데이터 구조 일 수있다.

이벤트 속성은 이벤트 및 이벤트 액세스 구성 요소에 의해 선언했다. 이벤트 접근 방법을 사용하면 이벤트 대리자 인스턴스에서 저장 및 제거를 추가하는 데 사용되는 데이터 구조를 정의합니다. 주의보다 이벤트 필드 이벤트 속성 느린, 그것을 호출하기 전에 각 이벤트 대리자를 검색 할 필요가 있기 때문이다. 그것은 속도와 메모리 사이의 절충이 필요합니다. 클래스가 자주 트리거 이벤트의 수를 정의한다면, 우리는 이벤트 속성을 구현해야합니다. 자세한 내용은 사용 이벤트 속성 여러 이벤트를 처리하는 방법 : .

 

추천

출처www.cnblogs.com/Tpf386/p/12111658.html