깊이 분석 C\#비동기 프로 그래 밍 상세 설명

동기 화 방법 과 비동기 방법의 차이 동기 화 방법 은 프로그램 이 계속 실행 되 기 전에 동기 화 방법 이 실 행 될 때 까지 기 다 려 야 합 니 다.호출 할 방법 과 같은 서명 의뢰 를 정의 합 니 다.공용 언어 라 이브 러 리 는 이 의뢰 에 적당 한 서명 을 가 진 BeginInvoke 와 EndInvoke 방법 을 자동 으로 정의 합 니 다.BeginInvoke 방법 은 비동기 호출 을 시작 하 는 데 사 용 됩 니 다.이것 은 비동기 실행 이 필요 한 방법 과 같은 매개 변 수 를 가지 고 있 습 니 다.단지 두 개의 추가 매개 변수 만 있 을 뿐 입 니 다.(나중에 설명 할 것 입 니 다.)BeginInvoke 는 비동기 호출 이 완료 되 기 를 기다 리 지 않 고 즉시 돌아 갑 니 다.BeginInvoke 는 IasyncResult 로 돌아 가 호출 진 도 를 감시 할 수 있 습 니 다.EndInvoke 방법 은 비동기 호출 결 과 를 검색 하 는 데 사 용 됩 니 다.BeginInvoke 를 호출 하면 EndInvoke 방법 을 수시로 호출 할 수 있 습 니 다.비동기 호출 이 완료 되 지 않 으 면 EndInvoke 는 비동기 호출 이 완 료 될 때 까지 차단 합 니 다.EndInvoke 의 인 자 는 비동기 실행 방법 이 필요 한 out 과 ref 인자(Visual Basic 에서ByRef 와 ByRef)와 BeginInvoke 에서 돌아 오 는 IAsyncResult 를 포함 합 니 다.BeginInvoke 와 EndInvoke 를 사용 하여 비동기 호출 을 하 는 네 가지 방법.BeginInvoke 를 호출 한 후 다음 과 같이 할 수 있 습 니 다.1.일부 작업 을 한 다음 에 EndInvoke 를 호출 하여 호출 이 완 료 될 때 까지 차단 합 니 다.2.IAsyncResult.AsyncWaitHandle 을 사용 하여 WaitHandle 을 가 져 옵 니 다.WaitOne 방법 을 사용 하면 WaitHandle 신 호 를 보 낼 때 까지 차단 한 다음 EndInvoke 를 호출 합 니 다.이것 은 주로 메 인 프로그램 이 비동기 방법 을 기다 리 고 비동기 방법의 결 과 를 기다 리 는 것 이다.3.BeginInvoke 에서 돌아 온 IAsyncResult,IAsyncResult.IsCompeted 에서 비동기 호출 이 언제 완 료 될 지 확인 한 다음 EndInvoke 를 호출 합 니 다.이 처 리 는 개인 적 으로 같다 고 생각한다.4.리 셋 방법 에 대한 의뢰 를 BeginInvoke 에 게 전달 합 니 다.이 방법 은 비동기 호출 이 끝 난 후 ThreadPool 스 레 드 에서 실 행 됩 니 다.EndInvoke 를 호출 할 수 있 습 니 다.이것 은 강제 변환 함수 에서 IAsyncResult.AsyncState(BeginInvoke 방법의 마지막 매개 변수)를 의뢰 한 다음 의뢰 로 EndInvoke 를 수행 합 니 다.경고 하 다.   비동기 호출 이 끝 난 후에 EndInvoke 를 호출 합 니 다.이상 이해 하지 못 하 는 것 이 있 으 면 잠시 후에 다시 이해 할 수 있 습 니 다. 예 1)리 셋 함수 가 없 는 간단 한 비동기 방법 예 를 들 어 프로그램 을 실행 할 때 주석 을 자세히 보면 이해 에 도움 이 됩 니 다.그리고 주석 중의 두 가지 방법 을 모두 동기 화하 면 비동기 운행 속도 의 우수 성 을 발견 할 수 있 습 니 다.4567913)2)리 셋 함수 가 있 는 WebRequest 와 WebResponse 의 비동기 동작 을 보십시오.

using System;
 namespace ConsoleApplication1
 {
     class Class1
     {
         //
         public delegate void AsyncEventHandler();

         //
         void Event1()
        {
            Console.WriteLine("Event1 Start");
            System.Threading.Thread.Sleep(4000);
            Console.WriteLine("Event1 End");
        }
        //
        void Event2()
        {
            Console.WriteLine("Event2 Start");
            int i=1;
            while(i<1000)
            {
                i=i+1;
                Console.WriteLine("Event2 "+i.ToString());
            }
            Console.WriteLine("Event2 End");
        }
        [STAThread]
        static void Main(string[] args)
        {
            long start=0;
            long end=0;
            Class1 c = new Class1();
            Console.WriteLine("ready");
            start=DateTime.Now.Ticks;
            //
            AsyncEventHandler asy = new AsyncEventHandler(c.Event1);
            // , AsyncState, null
            IAsyncResult ia = asy.BeginInvoke(null, null);
            // ,
            c.Event2();
            // , , , return, 。

            asy.EndInvoke(ia);
            // 。
            //c.Event1();
            //c.Event2();

            end =DateTime.Now.Ticks;
            Console.WriteLine(" ="+ Convert.ToString(end-start) );
            Console.ReadLine();
        }
    }
}
여기 서 반전 함수 가 있 고 비동기 반전 에서 비동기 조작 이 있다.우선 비동기 로 Response Stream 을 얻 은 다음 비동기 로 데 이 터 를 읽 습 니 다.이 프로그램 은 매우 고전적 이다.그 중에서 많은 것 을 배 울 수 있다.우리 함께 토론 합 시다.요약 하면.net framework 는 다른 방법 으로 도 사용 할 수 있다.그래서 비동기 적 인 용도 가 광범 위 하 다..net framework 라 이브 러 리 에 도 비동기 호출 방법 이 많다.일반적으로 이미 Begin 시작 End 끝 에 한 쌍,비동기 의뢰 방법 을 구성 하고 두 개의 반전 함수 와 AsyncState 파 라 메 터 를 추가 하여 비동기 작업 의 거시적인 표현 을 구성한다.따라서 비동기 프로 그래 밍 을 하려 면 delegate,Begin,End,AsyncCallBack 의뢰,AsyncState 인 스 턴 스(리 셋 함수 에서 IAsyncResult.AsyncState 를 통 해 강제 전환),IAsycResult(비동기 감시)를 의뢰 하 는 것 을 잊 지 마 세 요.

좋은 웹페이지 즐겨찾기