C\#에서 이벤트 의 정의 와 사용

7375 단어 C#이벤트
사건 의 성명 과 사용 은 대리 와 밀접 한 관 계 를 가진다.사건 은 사실 하나 이상 의 방법의 대리 이다.대상 의 특정한 상태 가 변화 하면 대 리 는 자동 으로 호출 되 고 대리 의 방법 은 자동 으로 집행 된다.
하나의 이 벤트 를 설명 하고 사용 하려 면 다음 과 같은 절차 가 필요 합 니 다.
1.프 록 시 를 만 듭 니 다.
2.클래스 내부 에서 이벤트 키 워드 를 이용 하여 이 벤트 를 설명 하고 클래스 에서 이 벤트 를 호출 하 는 방법 을 정의 하 며 이벤트 메 시 지 를 처리 하 는 방법 도 정의 할 수 있 습 니 다.
하나의 사건 을 설명 하 는 기본 형식 은 두 가지 가 있다.
수식 부호  event   유형   식별 자
수식 부호  event   유형   식별 자{get{};set{};}
그 중:
수식 자 는 C\#언어의 접근 수식 자 를 가리킨다.형식 은 이벤트 사용 을 설명 하 는 첫 번 째 단계 에서 만 든 에이전트 입 니 다.식별 자 는 C\#언어의 합 법 적 인 식별 자 입 니 다.이 식별 자 는 프로그램 에서 유일 하 게 성명 을 확인 하 는 이벤트 에 사 용 됩 니 다.이벤트 의 두 번 째 형식 에서 클래스 속성 과 유사 한 get 과 set 부분 을 가지 고 이벤트 의 get 과 set 부분의 의미,사용 방법 은 모두 속성 과 유사 합 니 다.
3.사건 과 관련 된 몇 가지 방법 을 설명 합 니 다.이벤트 와 방법 을 연결 하 는 과정 은 대리 대상 참조 방법 과 유사 합 니 다.이 방법 들 은 바로 사건 을 처리 하 는 방법 이다.
4.마지막 으로 프로그램 에서 이 벤트 를 사용 합 니 다.이 벤트 를 사용 하려 면 이벤트 의 정의 나 이벤트 가 정 의 된 이벤트 호출 방법 을 직접 호출 하거나 시스템 메 시 지 를 통 해 이 벤트 를 자동 으로 촉발 해 야 합 니 다.
하나의 예 로 사건 의 사용 을 설명 하 다.
이벤트 OnfileChange 를 포함 하 는 간단 한 클래스 를 만 듭 니 다.이 종 류 는 프로그램 을 실행 하 는 디 렉 터 리(현재 디 렉 터 리,보통 프로젝트 이름/bin/debug)에서 파일 test.txt 가 존재 하 는 지 확인 합 니 다.파일 이 삭제 되 거나 생 성 되면 이벤트 가 발생 합 니 다.이 파일 을 계속 조회 할 수 있 도록 MonitorFile 방법 도 제공 합 니 다.
방법:
사용 가능 한 이 벤트 를 만 들 기 전에 먼저 의뢰 를 설명 하고 클래스 밖 에 두 십시오.
public delegate void FileWatchEventHandler(object sender,EventArgs e);
다음 클래스 FileWatch 를 만 듭 니 다.그리고 이 벤트 를 설명 합 니 다.이벤트 의 유형 은 우리 가 이전에 정의 한 의뢰 입 니 다.
public event FileWatchEventHandler FileWatchEvent;
현재 생 성 방법 은 OnFileChange()입 니 다.이 방법 을 호출 하면 이벤트 가 발생 합 니 다.
protected virtual void OnFileChange(EventArgs e)
{
     if (FileWatchEvent!=null)
     {
         FileWatchEvent(this,e);
     }
}
마지막 으로 생 성 방법 MonitorFile(),
public void MonitorFile()
{
    bool bCurrentStatus;
  
    while(true)
    {
         bCurrentStatus = File.Exists("test.txt");
         if (bCurrentStatus != _bLastStatus) //_bLastStatus , false;
         {
             _bLastStatus = bCurrentStatus;
             OnFileChange(EventArgs.Empty);
         }
   
         Thread.Sleep(250);
    }
}
전체 코드 는 다음 과 같 습 니 다:
using System;
using System.Threading;
using System.IO;     

namespace Sample.Event
{

      public delegate void FileWatchEventHandler(object sender, EventArgs e);

      public class FileWatch
      {
            private bool _bLastStatus = false;
            public FileWatch()
            {
                  //
                  // TODO:
                  //
            }

            public event FileWatchEventHandler FileWatchEvent;

            protected virtual void OnFileChange(EventArgs e)
            {
                  if (FileWatchEvent != null)
                  {
                      
                        FileWatchEvent(this, e);
                  }
            }

            public void MonitorFile()
            {
                  bool bCurrentStatus;

                  while(true)
                  {
                        bCurrentStatus = File.Exists("test.txt");

                        // , , ;
                        if ( bCurrentStatus != _bLastStatus )
                        {
                              _bLastStatus = bCurrentStatus;
                              OnFileChange( EventArgs.Empty );
                        }

                      
                        Thread.Sleep(250);
                  }

            }
      }
}

사용:이전에 만 든 FileWatch 의 이 벤트 를 테스트 하기 위해 윈도 프로그램 을 만 듭 니 다.먼저 방금 만 든 항목 을 컴 파일 하여 Assembly:FileWatch.dll 을 만 든 다음 인용 을 추가 합 니 다.물론 항목 인용 을 직접 추가 해도 된다.그리고 윈도 프로그램 에 네 임 스페이스 를 추가 합 니 다.
using Sample.Event;
그 다음 에 응용 프로그램 클래스 에서 개인 필드 를 정의 합 니 다.형식 은 우리 가 만 든 클래스 FileWatch 입 니 다.
public class frmMain : System.Windows.Forms.Form
{
    private Sample.Event.FileWatch FileWatchEventSource;
구조 함수 에서 이 대상 을 예화 합 니 다.
public frmMain()
{
    InitializeComponent();
    FileWatchEventSource = new Sample.Event.FileWatch();
그리고 이벤트 에 로 컬 방법 OnFileChange 을 연결 합 니 다.
FileWatchEventSource.FileWatchEvent+=new Sample.Event.FileWatchEventHandler(OnFileChange);
이 벤트 를 촉발 하기 위해 MonitorFile 방법 을 사용 해 야 합 니 다.이 예 에서,우 리 는 스 레 드 로 MonitorFile 방법 을 제어 합 니 다.이렇게 하면
프로그램 이 방치 되 어 있 을 때 이 방법 을 실행 하여 이 벤트 를 촉발 합 니 다.
thrd = new Thread(new ThreadStart(FileWatchEventSource.MonitorFile));
thrd.Start();
마지막 으로 이벤트 가 실 행 될 지 여 부 를 알 아야 합 니 다.이벤트 가 실 행 된 기록 을 기록 하기 위해 서 는 Listbox 컨트롤 에 트리거 내용 을 추가 합 니 다.이벤트 가 실 행 된 후 호출 하 는 방법 은 OnFileChange 이기 때문에 이 방법 에 동작 을 넣 을 것 입 니 다.
private void OnFileChange(object Sender, EventArgs e)
{
   listBox.Items.Add(DateTime.Now.ToString()+": .");
}
이벤트 가 실 행 될 때 EventHanler 는 sender 와 EventArgs 류 의 인용 을 전달 합 니 다.EventArgs 류 는 보통 이벤트 소스 와 트리거 이벤트 사이 에 정 보 를 전달 합 니 다.이 예 에서 정 보 를 전달 하지 않 았 고 EventArgs 류 도 사용 하지 않 았 다.이 벤트 를 Listbox 에 추 가 했 을 뿐 입 니 다.
실행 결 과 는 다음 과 같 습 니 다.
//img.jbzj.com/file_images/article/201606/201606031007461.jpg
결론:C\#에서 이 벤트 를 사용 하 는 요점:
우선,의뢰 를 작성 해 야 합 니 다.형식 은:
public delegate void 의뢰 명(object sender,EventArgs e);
메모:의뢰 즉 C 의 함수 포인터 입 니 다.이벤트 에서 이벤트 및 트리거 대상 의 정 보 를 전달 해 야 하기 때문에 매개 변수 표 는 고정 되 어 있 습 니 다.의뢰 명 일반 형식:이름+EnvenHandle.이렇게 이름 을 짓 는 것 은 비교적 규범 적 이다.
그리고 이벤트 필드 를 만 듭 니 다:
public 이벤트 의뢰 유형 이벤트 이름;
메모:이벤트 키 워드 는 이벤트 입 니 다.반환 유형 은 의뢰 입 니 다.
이 벤트 를 처리 하 는 방법 을 다시 정의 하고 이 예 는 OnFileChange(EventArgs e)입 니 다.이 방법 에서 이 벤트 를 호출 해 야 합 니 다:
이벤트 이름(object,EventArgs);
여기 object 는 일반적으로 그 자체 이 고,실제 참 여 는 this 이 며,EventArgs 는 OnFileChange 에서 전 달 된 실제 참 여 를 해 야 하 며,특히 이벤트 의 값 을 전달 해 야 합 니 다.
마지막 으로 이 벤트 를 촉발 하 는 방법 을 만들어 야 합 니 다.예 를 들 어 MonitorFile()이 고 그 방법 에서 조건 이 만족 하면 OnFileChange 를 사용 하여 사건 을 촉발 하 는 목적 을 달성 합 니 다.
이 벤트 를 사용 할 때 보통 두 가지 방법 을 정의 합 니 다.하 나 는 이벤트 가 정의 하 는 의뢰 서명 과 일치 하 는 방법 입 니 다.이 예 에서 OnFileChange(Object sender,EventArgs e)입 니 다.
예 를 들 어 창 류 의 OnFileChange 와 이벤트 류 의 OnFileChange 는 다 릅 니 다.후 자 는 이벤트 호출 에 사용 되 고 전 자 는 이벤트 귀속 에 사 용 됩 니 다.이 벤트 를 연결 하 는 방법 은 간단 합 니 다.이 벤트 를 추가 하 는 것 을+=로 표시 합 니 다.-=이 벤트 를 삭제 하 는 것 을 표시 합 니 다.
예 중
FileWatchEventSource.FileWatchEvent+=new Sample.Event.FileWatchEventHandler(OnFileChange);
이벤트 추가
예:먼저 스 레 드 시작(thd.Start()을 한 다음 MonitorFile()방법 을 호출 합 니 다.이벤트 가 발생 하면 FileWatchEvent 가 발생 한 후 이벤트 FileWatchEvent 를 OnFileChange()방법 에 연결 하기 때 문 입 니 다.따라서 로 컬 창 류 인 OnFileChange()방법 을 호출 하여 현재 Listbox 에 정 보 를 추가 합 니 다.

좋은 웹페이지 즐겨찾기