요즘 delegate랑 thread를 열심히(?) 공부하고 있습니다..
나름 좀 이해가 된다고 생각은 되지만
언제 어떻게 적용하면 좋을지는 아직 잘 모르겠네요..;;;;
예제 코드는 이렇습니다.
일단 비동기로 호출할 Add 메서드가 있습니다.
public static int Add(int op1, int op2, out int result)
{
Console.WriteLine("[Add] 시작...");
Thread.Sleep(3000);
Console.WriteLine("[Add] 끝...");
return (result = op1 + op2);
}
중간 중간 화면에 하고 있는걸 보여주고
실제로 뭔가 하는거 처럼 보이도록 Thread.Sleep 을 해줍니다.
그리고 delegate도 하나 선언해 줍니다.
public delegate int AddDelegate(int op1, int op2, out int result);
이 delegate는 위에 있는 Add메서드와 signature가 같습니다.
그리고 다음과 같은 메인코드가 있습니다.
static void Main(string[] args)
{
int result;
AddDelegate add = new AddDelegate(Add);
Console.WriteLine("[Main] 비동기로 Add메서드 Invoke");
IAsyncResult iAR = add.BeginInvoke(6, 42, out result, null, null);
Console.WriteLine("[Main] 뭔가 하는거 처럼 보이도록...");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(200);
Console.Write(".");
}
Console.WriteLine("\n[Main] Add메서드가 끝날때 까지 대기...");
iAR.AsyncWaitHandle.WaitOne();
Console.WriteLine("[Main] Add메서드 종료");
add.EndInvoke(out result, iAR);
Console.WriteLine("[Main] result 는 '{0}'", result);
Console.ReadLine();
}
메인에서는 delegate에 메서드를 넣어서 만들어 주고
BeginInvoke해 줍니다.
(BeginInvoke의 네번째와 다섯번째 파라미터는 callBack과 위임 객체에 접근하기 위한 참고객체 입니다.)
그러면 Add메서드를 호출하는 작업스레드를 생성해 주고 IAsyncResult객체를 반환해 줍니다.
그 객체는 iAR에 들어가겠죠
중간에 들어있는 for문은 그냥 메인도 뭔가 하는거 처럼 보이게 하기위한 코드 입니다.
그리고 반환받은 IAsyncResult객체를 이용해서
스레드가 끝날 때 까지 대기 하도록 WaitOne을 호출 해 줍니다.
그 후에 EndInvoke를 이용해서 결과값을 반환 받습니다.
EndInvoke는 Add메서드와 동일한 반환값을 가지므로
result를 out으로 안해도 값을 받아올 수 있습니다.
간단해 보이는데
참 난감하네요. ;;
RECENT COMMENT