C #을 (동기 호출, 비동기 호출 비동기 콜백)
리뷰:
원래 저자는 한자의 클래스 이름을 사용하지만, 그것은 아주 나쁜 보이지만, 비동기 콜백을 사용하여 여전히 동기 호출 비동기 호출은, 아주 자세하게 설명. 아주 명확에서 원리.
------
이 문서에서는 세 가지 예 "동기 호출"을 통해 차이와 장단점의 "클래스 추가"의 구현, "비동기 호출"위탁하는 순간에 설명 할 것 "비동기 콜백."
먼저 다음 세 가지 예와 방법은 대리인 코드를 정의 호출 할 수 있습니다 :
AddHandler에에게 위임 공개 (A의 INT, INT B)를 int로,
공용 클래스 가산기 클래스
{
추가 INT 공공 정적 (A INT, INT B)
{
Console.WriteLine ( "시작 계산 :"A + + "+"+ B)
스레드. 슬립 (3000); // 삼초에게 운영을위한 시뮬레이션 방법
Console.WriteLine을 ( "계산이 이루어집니다!");
반환 A + B;
}
}
동기 호출
동기 호출의 임무에 사용되는 호출 방법. 동기 호출은 다음, 통화가 완료되면 전화를 한 후 아래로 계속 차단 통화 차단, 현재의 thread 호출 할 수 있습니다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "================ ================ 동기 SyncInvokeTest 호");
(.Add 가산기 클래스) AddHandler에 AddHandler에 핸들러 = 새로운 새;
INT 결과 = handler.Invoke (1, 2);
Console.WriteLine ( "... 뭔가 다른 일을 계속");
Console.WriteLine (결과를)
Console.ReadKey를 ();
}
}
그것은 (예 : IO 작업의 큰 숫자로) 많은 작업을 호출 할 경우 동기 호출이 가난한 사용자 경험의 결과로, 오랜 시간 동안 프로그램을 일시 정지 할 수 있습니다, 스레드를 차단합니다, 이번에는 비동기 호출은 매우 필요하다.
비동기 호출
비동기 호출 스레드를 차단하지 않습니다,하지만 박제 스레드 풀을 호출하는 프로그램의 메인 UI 스레드 또는 스레드를 진행할 수 있습니다.
비동기 대리자 호출은 BeginInvoke 및 EndInvoke에 의해 달성된다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 호출 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (클래스 합산 .Add);
// 된 IAsyncResult가 : 비동기 작업 인터페이스 (인터페이스)
// BeginInvoke : 비동기 방식의 위임을 시작합니다 (위임)
; 된 IAsyncResult 결과 = handler.BeginInvoke (1, 2, NULL, NULL)
Console.WriteLine ( "... 뭔가 다른 일을 계속");
// 비동기 작업을 반환
Console.WriteLine (handler.EndInvoke (결과));
Console.ReadKey ();
}
}
우리는 메인 쓰레드는 기다리지 않았다 볼 수 있지만 직접 아래로 실행할 수 있습니다.
그러나 문제는 여전히 시간이 호출의 끝 (이 상황은 가능성이 발생하는 것입니다)가 아닌 경우 메인 스레드가, EndInvoke를 실행할 때, 존재, 다음 호출의 결과를 기다리는 스레드는 계속 차단됩니다.
다음 비동기 대리자가 참조 기록 될 수있다 :
action.BeginInvoke (OBJ, AR => action.EndInvoke (AR), NULL);
간단한 문장이나 두 작업을 완료합니다.
비동기 콜백
호출의 끝이 자동으로 호출의 결과에 대한 대기를 해결하기 위해 콜백 함수를 호출 스레드가 여전히 상황을 차단하게됩니다 때, 콜백 함수를 사용하여.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 콜백 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (.Add 가산기 클래스);
// 비동기 작업 인터페이스 ( ! 주) 다른 방법을 BeginInvoke
된 IAsyncResult는 결과 = handler.BeginInvoke (1, 2, 새로운 새로운 AsyncCallback (콜백 함수), "AsycState : OK (확인)")
Console.WriteLine ( "... 뭔가 다른 일을 계속");
콘솔. ReadKey ();
}
정적 무효 콜백 (IAsyncResult를 결과)
{// 결과는 "부가형 .Add () 메소드"리턴 값
// AsyncResult이 구현 된 IAsyncResult 인터페이스 공간이다 System.Runtime.Remoting.Messaging
// AsyncDelegate 속성은 실제 사용자 정의 클래스를 위임 강제 할 수 있습니다.
처리기 = AddHandler에 (AddHandler에) (합니다 (AsyncResult) 결과) .AsyncDelegate;
Console.WriteLine (handler.EndInvoke (결과));
Console.WriteLine (result.AsyncState);
}
}
나는위원회의 종류는 다음 액세스 AddHandler.EndInvoke하기 위해, 비동기 대리인이 AddHandler에에 캐스팅해야합니다, AddHandler에있다 정의합니다. MAddHandler.EndInvoke은 원래 제출 AddHandler.BeginInvoke 결과를 얻기 위해 (, AsyncCallback 타입의) 비동기 콜백 함수에서 호출 할 수 있습니다.
문제 :
(1) INT 결과 handler.Invoke = ( 1,2)가
왜 호출 파라미터 및 반환 값 AddHandler에 수수료가 동일 있습니까?
답변 :
Invoke 메서드의 매개 변수는 간단하다, 수수료, (선택) 매개 변수 테이블 및 주요 기능은 UI 스레드에서 전화가 지정한 호출 방법 대리자 메서드를 돕는 것입니다. 메소드는 먼저 호출 스레드 (즉, 현재 스레드) 호출 UI 스레드 아니므로, 직접 실행 방법 대리인 가리키는 경우, 그렇지 않으면, 그것은 UI 스레드로 전환되며, 그런 다음 실행 방법 대리자 지적 . 현재 스레드는 UI 스레드 아닌지위원회 지점을 완료 할 때까지, 호출 방법은 차단하고 (필요하다면) 호출하는 스레드로 다시 복귀 스위치.
그래서 Invoke 메서드 매개 변수와 반환 값과 자신의 임무를 호출은 일치해야합니다.
(2)는 IAsyncResult handler.BeginInvoke = (1,2, NULL, NULL) 결과;
BeginInvoke : 비동기 시작 요청 스레드를 실행하는 호출 스레드 풀을
단순히 된 IAsyncResult 개체 (비동기 코어) IAsyncResult를 반환. 그는 비동기 작업을 저장하는 인터페이스 상태 정보, 당신은 또한 현재 비동기을 종료하는 데 사용할 수 있습니다.
참고 : BeginInvoke 및 EndInvoke 쌍의 경우에도 더 리턴 값 호출되지해야하지만,이 메모리 누수가 발생할 수 있으므로 여전히 EndInvoke를 호출해야합니다.
(3) IAsyncResult.AsyncState 속성 :
되는 비동기 동작에 대한 정의 또는 포함하는 정보가 사용자 정의 된 오브젝트를 얻을 수있다. 예를 들면 :
{
AddHandler에 핸들러 = (AddHandler에) result.AsyncState;
Console.WriteLine (handler.EndInvoke (결과));
.....
}
리뷰:
원래 저자는 한자의 클래스 이름을 사용하지만, 그것은 아주 나쁜 보이지만, 비동기 콜백을 사용하여 여전히 동기 호출 비동기 호출은, 아주 자세하게 설명. 아주 명확에서 원리.
------
이 문서에서는 세 가지 예 "동기 호출"을 통해 차이와 장단점의 "클래스 추가"의 구현, "비동기 호출"위탁하는 순간에 설명 할 것 "비동기 콜백."
먼저 다음 세 가지 예와 방법은 대리인 코드를 정의 호출 할 수 있습니다 :
AddHandler에에게 위임 공개 (A의 INT, INT B)를 int로,
공용 클래스 가산기 클래스
{
추가 INT 공공 정적 (A INT, INT B)
{
Console.WriteLine ( "시작 계산 :"A + + "+"+ B)
스레드. 슬립 (3000); // 삼초에게 운영을위한 시뮬레이션 방법
Console.WriteLine을 ( "계산이 이루어집니다!");
반환 A + B;
}
}
동기 호출
동기 호출의 임무에 사용되는 호출 방법. 동기 호출은 다음, 통화가 완료되면 전화를 한 후 아래로 계속 차단 통화 차단, 현재의 thread 호출 할 수 있습니다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "================ ================ 동기 SyncInvokeTest 호");
(.Add 가산기 클래스) AddHandler에 AddHandler에 핸들러 = 새로운 새;
INT 결과 = handler.Invoke (1, 2);
Console.WriteLine ( "... 뭔가 다른 일을 계속");
Console.WriteLine (결과를)
Console.ReadKey를 ();
}
}
그것은 (예 : IO 작업의 큰 숫자로) 많은 작업을 호출 할 경우 동기 호출이 가난한 사용자 경험의 결과로, 오랜 시간 동안 프로그램을 일시 정지 할 수 있습니다, 스레드를 차단합니다, 이번에는 비동기 호출은 매우 필요하다.
비동기 호출
비동기 호출 스레드를 차단하지 않습니다,하지만 박제 스레드 풀을 호출하는 프로그램의 메인 UI 스레드 또는 스레드를 진행할 수 있습니다.
비동기 대리자 호출은 BeginInvoke 및 EndInvoke에 의해 달성된다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 호출 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (클래스 합산 .Add);
// 된 IAsyncResult가 : 비동기 작업 인터페이스 (인터페이스)
// BeginInvoke : 비동기 방식의 위임을 시작합니다 (위임)
; 된 IAsyncResult 결과 = handler.BeginInvoke (1, 2, NULL, NULL)
Console.WriteLine ( "... 뭔가 다른 일을 계속");
// 비동기 작업을 반환
Console.WriteLine (handler.EndInvoke (결과));
Console.ReadKey ();
}
}
우리는 메인 쓰레드는 기다리지 않았다 볼 수 있지만 직접 아래로 실행할 수 있습니다.
그러나 문제는 여전히 시간이 호출의 끝 (이 상황은 가능성이 발생하는 것입니다)가 아닌 경우 메인 스레드가, EndInvoke를 실행할 때, 존재, 다음 호출의 결과를 기다리는 스레드는 계속 차단됩니다.
다음 비동기 대리자가 참조 기록 될 수있다 :
action.BeginInvoke (OBJ, AR => action.EndInvoke (AR), NULL);
간단한 문장이나 두 작업을 완료합니다.
비동기 콜백
호출의 끝이 자동으로 호출의 결과에 대한 대기를 해결하기 위해 콜백 함수를 호출 스레드가 여전히 상황을 차단하게됩니다 때, 콜백 함수를 사용하여.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 콜백 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (.Add 가산기 클래스);
// 비동기 작업 인터페이스 ( ! 주) 다른 방법을 BeginInvoke
된 IAsyncResult는 결과 = handler.BeginInvoke (1, 2, 새로운 새로운 AsyncCallback (콜백 함수), "AsycState : OK (확인)")
Console.WriteLine ( "... 뭔가 다른 일을 계속");
콘솔. ReadKey ();
}
정적 무효 콜백 (IAsyncResult를 결과)
{// 결과는 "부가형 .Add () 메소드"리턴 값
// AsyncResult이 구현 된 IAsyncResult 인터페이스 공간이다 System.Runtime.Remoting.Messaging
// AsyncDelegate 속성은 실제 사용자 정의 클래스를 위임 강제 할 수 있습니다.
처리기 = AddHandler에 (AddHandler에) (합니다 (AsyncResult) 결과) .AsyncDelegate;
Console.WriteLine (handler.EndInvoke (결과));
Console.WriteLine (result.AsyncState);
}
}
나는위원회의 종류는 다음 액세스 AddHandler.EndInvoke하기 위해, 비동기 대리인이 AddHandler에에 캐스팅해야합니다, AddHandler에있다 정의합니다. MAddHandler.EndInvoke은 원래 제출 AddHandler.BeginInvoke 결과를 얻기 위해 (, AsyncCallback 타입의) 비동기 콜백 함수에서 호출 할 수 있습니다.
문제 :
(1) INT 결과 handler.Invoke = ( 1,2)가
왜 호출 파라미터 및 반환 값 AddHandler에 수수료가 동일 있습니까?
답변 :
Invoke 메서드의 매개 변수는 간단하다, 수수료, (선택) 매개 변수 테이블 및 주요 기능은 UI 스레드에서 전화가 지정한 호출 방법 대리자 메서드를 돕는 것입니다. 메소드는 먼저 호출 스레드 (즉, 현재 스레드) 호출 UI 스레드 아니므로, 직접 실행 방법 대리인 가리키는 경우, 그렇지 않으면, 그것은 UI 스레드로 전환되며, 그런 다음 실행 방법 대리자 지적 . 현재 스레드는 UI 스레드 아닌지위원회 지점을 완료 할 때까지, 호출 방법은 차단하고 (필요하다면) 호출하는 스레드로 다시 복귀 스위치.
그래서 Invoke 메서드 매개 변수와 반환 값과 자신의 임무를 호출은 일치해야합니다.
(2)는 IAsyncResult handler.BeginInvoke = (1,2, NULL, NULL) 결과;
BeginInvoke : 비동기 시작 요청 스레드를 실행하는 호출 스레드 풀을
단순히 된 IAsyncResult 개체 (비동기 코어) IAsyncResult를 반환. 그는 비동기 작업을 저장하는 인터페이스 상태 정보, 당신은 또한 현재 비동기을 종료하는 데 사용할 수 있습니다.
참고 : BeginInvoke 및 EndInvoke 쌍의 경우에도 더 리턴 값 호출되지해야하지만,이 메모리 누수가 발생할 수 있으므로 여전히 EndInvoke를 호출해야합니다.
(3) IAsyncResult.AsyncState 속성 :
되는 비동기 동작에 대한 정의 또는 포함하는 정보가 사용자 정의 된 오브젝트를 얻을 수있다. 예를 들면 :
{
AddHandler에 핸들러 = (AddHandler에) result.AsyncState;
Console.WriteLine (handler.EndInvoke (결과));
.....
}
리뷰:
원래 저자는 한자의 클래스 이름을 사용하지만, 그것은 아주 나쁜 보이지만, 비동기 콜백을 사용하여 여전히 동기 호출 비동기 호출은, 아주 자세하게 설명. 아주 명확에서 원리.
------
이 문서에서는 세 가지 예 "동기 호출"을 통해 차이와 장단점의 "클래스 추가"의 구현, "비동기 호출"위탁하는 순간에 설명 할 것 "비동기 콜백."
먼저 다음 세 가지 예와 방법은 대리인 코드를 정의 호출 할 수 있습니다 :
AddHandler에에게 위임 공개 (A의 INT, INT B)를 int로,
공용 클래스 가산기 클래스
{
추가 INT 공공 정적 (A INT, INT B)
{
Console.WriteLine ( "시작 계산 :"A + + "+"+ B)
스레드. 슬립 (3000); // 삼초에게 운영을위한 시뮬레이션 방법
Console.WriteLine을 ( "계산이 이루어집니다!");
반환 A + B;
}
}
동기 호출
동기 호출의 임무에 사용되는 호출 방법. 동기 호출은 다음, 통화가 완료되면 전화를 한 후 아래로 계속 차단 통화 차단, 현재의 thread 호출 할 수 있습니다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "================ ================ 동기 SyncInvokeTest 호");
(.Add 가산기 클래스) AddHandler에 AddHandler에 핸들러 = 새로운 새;
INT 결과 = handler.Invoke (1, 2);
Console.WriteLine ( "... 뭔가 다른 일을 계속");
Console.WriteLine (결과를)
Console.ReadKey를 ();
}
}
그것은 (예 : IO 작업의 큰 숫자로) 많은 작업을 호출 할 경우 동기 호출이 가난한 사용자 경험의 결과로, 오랜 시간 동안 프로그램을 일시 정지 할 수 있습니다, 스레드를 차단합니다, 이번에는 비동기 호출은 매우 필요하다.
비동기 호출
비동기 호출 스레드를 차단하지 않습니다,하지만 박제 스레드 풀을 호출하는 프로그램의 메인 UI 스레드 또는 스레드를 진행할 수 있습니다.
비동기 대리자 호출은 BeginInvoke 및 EndInvoke에 의해 달성된다.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 호출 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (클래스 합산 .Add);
// 된 IAsyncResult가 : 비동기 작업 인터페이스 (인터페이스)
// BeginInvoke : 비동기 방식의 위임을 시작합니다 (위임)
; 된 IAsyncResult 결과 = handler.BeginInvoke (1, 2, NULL, NULL)
Console.WriteLine ( "... 뭔가 다른 일을 계속");
// 비동기 작업을 반환
Console.WriteLine (handler.EndInvoke (결과));
Console.ReadKey ();
}
}
우리는 메인 쓰레드는 기다리지 않았다 볼 수 있지만 직접 아래로 실행할 수 있습니다.
그러나 문제는 여전히 시간이 호출의 끝 (이 상황은 가능성이 발생하는 것입니다)가 아닌 경우 메인 스레드가, EndInvoke를 실행할 때, 존재, 다음 호출의 결과를 기다리는 스레드는 계속 차단됩니다.
다음 비동기 대리자가 참조 기록 될 수있다 :
action.BeginInvoke (OBJ, AR => action.EndInvoke (AR), NULL);
간단한 문장이나 두 작업을 완료합니다.
비동기 콜백
호출의 끝이 자동으로 호출의 결과에 대한 대기를 해결하기 위해 콜백 함수를 호출 스레드가 여전히 상황을 차단하게됩니다 때, 콜백 함수를 사용하여.
{
정적 무효 메인 ()
{
Console.WriteLine ( "비동기 콜백 ================ ================ AsyncInvokeTest");
AddHandler에 AddHandler에 처리기 = 새로운 새 (.Add 가산기 클래스);
// 비동기 작업 인터페이스 ( ! 주) 다른 방법을 BeginInvoke
된 IAsyncResult는 결과 = handler.BeginInvoke (1, 2, 새로운 새로운 AsyncCallback (콜백 함수), "AsycState : OK (확인)")
Console.WriteLine ( "... 뭔가 다른 일을 계속");
콘솔. ReadKey ();
}
정적 무효 콜백 (IAsyncResult를 결과)
{// 결과는 "부가형 .Add () 메소드"리턴 값
// AsyncResult이 구현 된 IAsyncResult 인터페이스 공간이다 System.Runtime.Remoting.Messaging
// AsyncDelegate 속성은 실제 사용자 정의 클래스를 위임 강제 할 수 있습니다.
AddHandler에 핸들러 = (AddHandler에) ((AsyncResult) 결과) .AsyncDelegate;
Console.WriteLine (handler.EndInvoke (결과));
Console.WriteLine (result.AsyncState);
}
}
나는위원회의 종류는 다음 액세스 AddHandler.EndInvoke하기 위해, 비동기 대리인이 AddHandler에에 캐스팅해야합니다, AddHandler에있다 정의합니다. MAddHandler.EndInvoke은 원래 제출 AddHandler.BeginInvoke 결과를 얻기 위해 (, AsyncCallback 타입의) 비동기 콜백 함수에서 호출 할 수 있습니다.
문제 :
(1) INT 결과 handler.Invoke = ( 1,2)가
왜 호출 파라미터 및 반환 값 AddHandler에 수수료가 동일 있습니까?
답변 :
Invoke 메서드의 매개 변수는 간단하다, 수수료, (선택) 매개 변수 테이블 및 주요 기능은 UI 스레드에서 전화가 지정한 호출 방법 대리자 메서드를 돕는 것입니다. 메소드는 먼저 호출 스레드 (즉, 현재 스레드) 호출 UI 스레드 아니므로, 직접 실행 방법 대리인 가리키는 경우, 그렇지 않으면, 그것은 UI 스레드로 전환되며, 그런 다음 실행 방법 대리자 지적 . 현재 스레드는 UI 스레드 아닌지위원회 지점을 완료 할 때까지, 호출 방법은 차단하고 (필요하다면) 호출하는 스레드로 다시 복귀 스위치.
그래서 Invoke 메서드 매개 변수와 반환 값과 자신의 임무를 호출은 일치해야합니다.
(2)는 IAsyncResult handler.BeginInvoke = (1,2, NULL, NULL) 결과;
BeginInvoke : 비동기 시작 요청 스레드를 실행하는 호출 스레드 풀을
단순히 된 IAsyncResult 개체 (비동기 코어) IAsyncResult를 반환. 그는 비동기 작업을 저장하는 인터페이스 상태 정보, 당신은 또한 현재 비동기을 종료하는 데 사용할 수 있습니다.
참고 : BeginInvoke 및 EndInvoke 쌍의 경우에도 더 리턴 값 호출되지해야하지만,이 메모리 누수가 발생할 수 있으므로 여전히 EndInvoke를 호출해야합니다.
(3) IAsyncResult.AsyncState 속성 :
되는 비동기 동작에 대한 정의 또는 포함하는 정보가 사용자 정의 된 오브젝트를 얻을 수있다. 예를 들면 :
{
AddHandler에 핸들러 = (AddHandler에) result.AsyncState;
Console.WriteLine (handler.EndInvoke (결과));
.....
}