c\#비동기 프로 그래 밍 을 사용 하 는 방법

이 보 를 어떻게 사용 하 는 지 는 의뢰 로 처리 하 는 것 입 니 다.의뢰 대상 이 호출 목록 에 한 가지 방법 만 있다 면 이 방법 을 비동기 로 실행 할 수 있 습 니 다.의뢰 류 는 두 가지 방법 이 있 는데,BeginInvoke 와 EndInvoke 라 고 하 는데,이것 은 비동기 실행 에 사용 된다.
비동기 에는 세 가지 모델 이 있다.
4.567917 대기 모드 는 비동기 방법 과 다른 처 리 를 한 후에 원시 스 레 드 가 중단 되 고 비동기 방법 이 완 성 된 후에 계속 합 니 다4.567917.폴 링 모드,원본 스 레 드 는 정기 적 으로 시 작 된 스 레 드 가 완성 되 었 는 지 확인 하고 없 으 면 다른 일 을 계속 할 수 있 습 니 다4.567917.리 셋 모드 는 원본 스 레 드 가 계속 실행 되 고 있 으 며 시작 하 는 스 레 드 가 완성 되 었 는 지 기다 리 거나 검사 할 필요 가 없습니다.시 작 된 스 레 드 에서 의 인용 방법 이 완 료 된 후에 시 작 된 스 레 드 는 리 셋 방법 으로 EndInvoke 를 호출 하기 전에 비동기 적 인 방법 을 처리 하 는 구 조 를 호출 합 니 다.
비동기 프로 그래 밍 을 배우 기 전에 BeginInvoke 와 EndInvoke 방법 을 살 펴 보 세 요.
정적 변수:정적 변 수 는 static 수식 자 를 사용 하여 소속 클래스 가 불 러 올 때 클래스 를 통 해 소속 클래스 에 접근 하 는 모든 인 스 턴 스 를 만 드 는 같은 정적 변 수 는 같은 값 입 니 다.
비정 상 변수:static 수정자 성명 이 없 는 변 수 를 비정 상 변수 라 고 합 니 다.클래스 가 예화 되 었 을 때 대상 을 통 해 같은 종류의 인 스 턴 스 를 방문 하 는 같은 비정 상 변 수 를 만 드 는 것 은 서로 다른 값 일 수 있 습 니 다.
BeginInvoke 방법
BeginInvoke 를 호출 할 때 매개 변수 목록 의 실제 인삼 구성 은 다음 과 같 습 니 다.
1)  인용 방법 에 필요 한 인자.
2)  두 개의 추가 매개 변수 인 callback 매개 변수 와 state 매개 변수.
BeginInvoke 는 스 레 드 탱크 에서 스 레 드 를 가 져 오고 새로운 스 레 드 가 시 작 될 때 인용 방법 을 실행 합 니 다.
BeginInvoke 는 호출 스 레 드 에 IasyncResult 인 터 페 이 스 를 실현 하 는 대상 을 되 돌려 줍 니 다.이 인 터 페 이 스 는 비동기 방법 을 포함 하 는 현재 상 태 를 참조 하고 원본 스 레 드 를 계속 실행 할 수 있 습 니 다.
EndInvoke 방법
BeginInvoke 방법 으로 되 돌아 오 는 IasyncResult 대상 의 인용 을 받 아들 이 고 연 결 된 스 레 드 를 찾 습 니 다.
스 레 드 탱크 의 스 레 드 가 종료 되 었 다 면 EndInvoke 는 다음 과 같은 일 을 합 니 다.
1)  스 레 드 를 종료 한 상 태 를 정리 하고 자원 을 방출 합 니 다.
2)  그것 은 인용 방법 이 되 돌아 오 는 값 을 찾 아 값 을 되 돌려 줍 니 다.
EndInvoke 가 호출 되 었 을 때 스 레 드 탱크 의 스 레 드 가 실행 되 고 있 으 면 스 레 드 가 정리 되 고 값 이 돌아 올 때 까지 기다 리 고 있 습 니 다.EndInvoke 는 열 린 스 레 드 를 청소 하기 위해 서 이기 때문에 모든 BeginInvoke 에 EndInvoke 를 호출 하도록 확보 해 야 합 니 다.
비동기 방법 이 이상 을 일 으 키 면 EndInvoke 를 호출 할 때 이상 을 던 집 니 다.
대기 모드
이 모드 에서 원본 스 레 드 는 다른 방법 으로 호출 되 고 다른 처 리 를 한 다음 에 열 린 스 레 드 가 끝 날 때 까지 멈 추고 기 다 립 니 다.아래 그림

이 코드 는 다음 과 같은 출력 을 만 들 었 다.

BeginInvoke 와 EndInoke 의 가장 간단 한 형식 을 보 았 으 니 IasyncResult 를 더 알 수 있 습 니 다.이것 은 이러한 방법 을 사용 하 는 필수 적 인 부분 입 니 다.
BeginInvoke 는 IasyncResult 인터페이스의 인용 을 되 돌려 줍 니 다.(내 부 는 AsyncResult 클래스 의 대상 입 니 다.)AsyncResult 류 는 비동기 적 인 방법의 상 태 를 나 타 냈 다.다음 그림:

4.567917.우리 가 의뢰 대상 의 BeginInvoke 방법 을 호출 할 때 시스템 은 AsyncResult 류 의 대상 을 만 들 었 습 니 다.그러나 클래스 의 인용 을 되 돌려 주지 않 고 대상 에 포 함 된 IasyncResult 인터페이스의 인용 을 되 돌려 줍 니 다
  • AsyncResult 대상 은 AsyncDelegate 라 는 속성 을 포함 하고 있 으 며,비동기 적 인 방법 을 실행 하기 위 한 의뢰 의 인용 을 되 돌려 줍 니 다.그러나 이 속성 은 클래스 대상 의 일부분 이 아니 라 인터페이스의 일부분 이다
  • IsComplete 속성 은 불 값 을 되 돌려 줍 니 다.비동기 방법 이 완성 되 었 는 지 여 부 를 표시 합 니 다
  • AsyncState 속성 은 대상 의 인용 을 되 돌려 줍 니 다.이것 은 BeginInvoke 방법 으로 호출 될 때의 state 매개 변수 입 니 다.object 형식의 인용 을 되 돌려 주 고 나중에 설명 하 겠 습 니 다.
  • 폴 링 모드
    폴 링 모드 에서 원본 스 레 드 는 비동기 적 인 방법 으로 호출 되 었 고 다른 처 리 를 한 다음 에 IAsyncResult 대상 의 IsComplete 속성 을 사용 하여 열 린 스 레 드 가 완성 되 었 는 지 정기 적 으로 검사 합 니 다.비동기 방법 이 완료 되면 원본 스 레 드 는 EndInvoke 를 호출 하고 계속 합 니 다.그렇지 않 으 면,그것 은 다른 처 리 를 한 후에 잠시 후에 다시 검사 할 것 이다.다음 그림:

    이 코드 는 다음 과 같은 출력 을 만 들 었 다.

    리 턴 모드
    이전 대기 모드 와 폴 링 모드 에서 초기 스 레 드 는 열 린 스 레 드 가 완 료 될 때 까지 자신의 제어 절 차 를 계속 합 니 다.그리고 결 과 를 얻 고 계속 합 니 다.
    리 턴 모드 의 차이 점 은 초기 스 레 드 가 비동기 적 인 방법 을 시작 하면 스스로 관리 하고 동기 화 를 고려 하지 않 는 다 는 것 이다.비동기 방법 호출 이 끝 난 후에 시스템 은 사용자 정의 방법 으로 끝 을 처리 하고 의뢰 한 EndInvoke 방법 을 호출 합 니 다.이 사용자 가 정의 한 방법 을 리 셋 방법 이나 리 셋 이 라 고 합 니 다.
    BeginInvoke 의 매개 변수 목록 에서 마지막 두 개의 추가 매개 변 수 를 리 셋 하 는 방법 으로 사용 합 니 다.
    1)  첫 번 째 매개 변수,callback 매개 변 수 는 리 셋 방법의 이름 입 니 다.
    2)  두 번 째 매개 변수,state 매개 변 수 는 null 또는 리 셋 방법 에 들 어 갈 대상 데이터 일 수 있 습 니 다.IAsyncResult 인자 의 AsyncState 속성 을 사용 하여 이 대상 을 가 져 올 수 있 습 니 다.매개 변수 형식 은 object 입 니 다.
    리 셋 방법의 서명 과 리 턴 형식 은 AsyncCallback 의뢰 형식 과 일치 해 야 합 니 다.IAsyncResult 를 매개 변수 로 받 아들 이 고 형식 을 void 로 되 돌려 주 는 방법 이 필요 합 니 다.다음 과 같다.
    Void AsyncCallback(IAsyncResult iar)
    리 셋 방법 에서,우리 의 코드 는 다른 방법 으로 실 행 된 출력 값 을 처리 하기 위해 의뢰 한 EndInvoke 방법 을 호출해 야 합 니 다.의뢰 한 EndInvoke 방법 을 호출 하려 면 의뢰 대상 의 인용 이 필요 합 니 다.초기 스 레 드 에 서 는 스 레 드 를 열지 않 습 니 다.만약 우리 가 BeginInvoke 의 state 인 자 를 다른 용도 로 사용 하지 않 는 다 면,그것 을 사용 하여 호출 방법 에 대한 인용 을 보 낼 수 있 습 니 다.그렇지 않 으 면 매개 변수 로 보 내 는 IAsyncResult 대상 에서 의뢰 한 인용 을 추출 할 수 있 습 니 다.
    1)  리 셋 방법 에 대한 매개 변 수 는 하나 입 니 다.방금 끝 난 비동기 방법의 IAsyncResult 인터페이스 참조 입 니 다.IAsyncResult 인터페이스 대상 은 AsyncResult 류 대상 내부 에 있 음 을 기억 하 십시오.
    2)  IAsyncResult 인 터 페 이 스 는 의뢰 대상 의 인용 이 없 지만,이 를 포함 하 는 AsyncResult 클래스 대상 은 의뢰 대상 의 인용 이 있 습 니 다.
    3)  클래스 대상 의 인용 이 있 습 니 다.우 리 는 현재 클래스 대상 의 AsyncDelegate 속성 을 호출 하여 적당 한 의뢰 유형 으로 바 꿀 수 있 습 니 다.이렇게 해서 의뢰 인용 을 받 았 습 니 다.우 리 는 그것 으로 EndInvoke 를 호출 할 수 있 습 니 다.
    다음 코드 와 같이:

    이 코드 는 다음 과 같은 출력 을 만 들 었 다.

    이상 은 c\#비동기 프로 그래 밍 을 사용 하 는 방법 에 대한 상세 한 내용 입 니 다.c\#비동기 프로 그래 밍 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기