... | ... | @@ -1651,3 +1651,64 @@ class AsyncCallEx1 |
|
|
ThreadPool의 QueueUserWorkItem과 비교해서 비동기 호출로 얻는 이득은 크지 않다. 게임이나 웹 서버 등 동시 접속자 수가 많은 곳에서 유효하게 쓰인다.
|
|
|
|
|
|
### Delegate의 비동기 호출
|
|
|
비동기 호출은 입출력 장치와의 속도 차이에서 오는 비효율적인 스레드 사용 문제를 해결하는데 사용한다. 또한, 닷넷에서는 일반 메서드에 대해서도 비동기 호출을 할 수 있는 수단을 제공하는데, 델리게이트가 그 역할을 한다.
|
|
|
|
|
|
델리게이트의 비동기 호출 실행을 스레드 풀에서 하는 예제이다.
|
|
|
|
|
|
```c#
|
|
|
class DelegateAsyncCallEx1 //델리게이트의 비동기 호출 실행을 스레드 풀에서 하는 예제.
|
|
|
{
|
|
|
public delegate long CalcMethod(int start, int end);
|
|
|
//Cumsum 메서드를 받을 수 있는 델리게이트 선언.
|
|
|
//Cumsum 메서드는 start부터 end까지 수들의 합계를 구하는 것.
|
|
|
|
|
|
public static void Main()
|
|
|
{
|
|
|
CalcMethod calc = new CalcMethod(Util.Cumsum);
|
|
|
|
|
|
IAsyncResult ar = calc.BeginInvoke(1, 100, null, null);
|
|
|
//calc의 연산은 스레드 풀의 스레드에서 실행한다.
|
|
|
//끝나면 호출할 콜백함수나, 넘길 데이터가 없으므로 null,null
|
|
|
|
|
|
ar.AsyncWaitHandle.WaitOne();
|
|
|
//AsyncWaitHandle의 타입은 EventWaitHandle 타입이다. Cumsum이 완료되면 Signal로 바뀐다.
|
|
|
//Cumsum이 완료될 때까지 WaitOne에서 주 스레드는 대기한다.
|
|
|
|
|
|
long result = calc.EndInvoke(ar);
|
|
|
//Cumsum의 결과값을 얻기위해서 EndInvoke를 호출하였다.
|
|
|
//EndInvoke는 비동기 호출이 완료될 때 까지 호출하는 스레드를 차단한다.
|
|
|
//그래서 리턴 값이 없더라도 항상 EndInvoke를 호출하여 비동기 호출을 완료하는 것이 권장된다.
|
|
|
|
|
|
Console.WriteLine("합계 : {0}", result);
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
<br />
|
|
|
|
|
|
|
|
|
FileStream의 비동기 호출과 유사한 Delegate의 비동기 호출 예제
|
|
|
```c#
|
|
|
class DelegateAsyncCallEx2 //FileStream의 비동기 호출과 유사한 Delegate의 비동기 호출 예제
|
|
|
{
|
|
|
public delegate long CalcMethod(int start, int end);
|
|
|
|
|
|
public static void Main()
|
|
|
{
|
|
|
CalcMethod calc = new CalcMethod(Util.Cumsum);
|
|
|
|
|
|
calc.BeginInvoke(1, 100, calcCompleted, calc);
|
|
|
//비동기 호출이 시작된다. 끝나면 calcComplete를 스레드 풀에서 실행한다.
|
|
|
}
|
|
|
|
|
|
static void calcCompleted(IAsyncResult ar)
|
|
|
{
|
|
|
CalcMethod calc = ar.AsyncState as CalcMethod; //BeginInvoke에서 매개변수로 보낸 calc를 형변환해서 받는다.
|
|
|
|
|
|
long result = calc.EndInvoke(ar); //비동기 호출 결과를 리턴해준다.
|
|
|
|
|
|
Console.WriteLine(result);
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
|