C\#에서 의뢰 한 동기 호출 과 비동기 호출 을 분석 합 니 다(인 스 턴 스 상세 설명)
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);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.