요즘 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으로 안해도 값을 받아올 수 있습니다.

간단해 보이는데
참 난감하네요. ;;

by 피요히코~ 2010. 10. 8. 16:44
| 1 |