C\#에서 의뢰 한 동기 호출 과 비동기 호출 을 분석 합 니 다(인 스 턴 스 상세 설명)

동기 화 호출 을 위 한 Invoke 방법 을 의뢰 합 니 다.동기 호출 도 차단 호출 이 라 고 할 수 있 습 니 다.현재 스 레 드 를 막 은 다음 호출 을 실행 하고 호출 이 끝 난 후에 계속 아래로 진행 합 니 다.동기 호출 의 예:

using System;
using System.Threading;
public delegate int AddHandler(int a, int b);
public class Foo {
 static void Main() {
  Console.WriteLine("**********SyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  int result = handler.Invoke(1,2);
  Console.WriteLine("Do other work... ... ...");
  Console.WriteLine(result);
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }
} :
**********SyncInvokeTest**************
Computing 1 + 2 ...
Computing Complete.
Do other work... ... ...
동기 호출 은 스 레 드 를 막 을 수 있 습 니 다.힘 든 작업(예 를 들 어 대량의 IO 작업)을 호출 하려 면 프로그램 을 오래 멈 추고 나 쁜 사용자 체험 을 할 수 있 습 니 다.이 럴 때 비동기 호출 이 필요 합 니 다.비동기 호출 은 스 레 드 를 막 지 않 고 스 레 드 탱크 에 호출 합 니 다.프로그램의 메 인 스 레 드 나 UI 스 레 드 는 계속 실 행 될 수 있 습 니 다.의뢰 한 비동기 호출 은 BeginInvoke 와 EndInvoke 를 통 해 이 루어 집 니 다.비동기 호출:

using System;
using System.Threading;
public delegate int AddHandler(int a, int b);
public class Foo {
 static void Main() {
  Console.WriteLine("**********AsyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  IAsyncResult result = handler.BeginInvoke(1,2,null,null);
  Console.WriteLine("Do other work... ... ...");
  Console.WriteLine(handler.EndInvoke(result));
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }
} : **********AsyncInvokeTest**************
Do other work... ... ...
Computing 1 + 2 ...
Computing Complete.
메 인 스 레 드 가 기다 리 지 않 고 바로 아래로 실행 되 는 것 을 볼 수 있 습 니 다.그러나 문 제 는 여전히 존재 합 니 다.주 스 레 드 가 EndInvoke 로 실 행 될 때 호출 이 끝나 지 않 으 면 호출 결 과 를 기다 리 기 위해 스 레 드 가 막 힐 수 있 습 니 다.해결 방법 은 리 셋 함 수 를 사용 하 는 것 입 니 다.호출 이 끝 날 때 자동 으로 리 셋 함수 리 셋 이 종 료 됩 니 다.

public class Foo {
 static void Main() {
  Console.WriteLine("**********AsyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),"AsycState:OK");
  Console.WriteLine("Do other work... ... ...");
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }

 static void AddComplete(IAsyncResult result) {
  AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;
  Console.WriteLine(handler.EndInvoke(result));
  Console.WriteLine(result.AsyncState);
 }
}

좋은 웹페이지 즐겨찾기