'델리게이트'에 해당되는 글 2건

  1. 2010.03.27 Delegate-2
  2. 2010.03.25 Delegate
2010. 3. 27. 10:18

동기 Delegate

1. 우선 Delegate 함수를 만들어준다.
예) delegate void DeleStu(); //여기서 인자를 넣어주면 나중에 Invoke를 호출할때 인자가 추가되서 들어간다.

2. Delegate 객체를 만들어준다.
예) DeleStu sDel = new DeleStu(s.Study);  //만들어주면서 안에 Delegate를 이용해 호출할 함수를 인자로 넣어준다.

3. Delegate를 실행한다.
예) sDel.Invoke();  //만약 처음에 생성해줄대 카운트를 인자로넣었다면! Invoke(3); 이렇게 하면 함수를 3번호출하게된다.


비동기 Delegate

1, 2 같다.

3. Delegate를 비동기로 실행한다.
예) TDel.BeginInvoke(EndTDel, TDel); //첫번째는 호출할 콜백함수 , 두번째는 비동기할 객체
//만약 1번에서 인자를 넣어 주었다면 EndTDel 앞에 인자가 더 생긴다.

TDel.BeginInvoke(3, EndTDel, TDel);  // 이렇게 호출된다면 Tdel를 호출하면 3번을 실행하게된다.

        void EndTDel(IAsyncResult iar) //인자로 비동기할 객체가 들어가는것같다.
        {
            DeleTeacher TDel = iar.AsyncState as DeleTeacher;
            if (TDel != null)
            TDel();
          
            TDel.EndInvoke(iar);
        }

'.NET > C#' 카테고리의 다른 글

Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Catch(Exception)  (0) 2010.03.25
Posted by 아몰라

댓글을 달아 주세요

2010. 3. 25. 10:47

1. 개념

 만약 어떤 기능을 실행하는 메소드를 호출할 필요가 있을때, 그냥 직접적으로 호출하는 형식입니다.

 델리게이트는 호출하는코드랑 호출되는메서드 사이에 있다고 생각하면 됩니다.

 

어떤 메소드를 호출한다고할때.

델리게이트 사용       : 메소드호출 ---> 델리게이트 ---> 호출당하는 메소드

일반적인메소드호출 : 메소드호출 ---> 호출당하는 메소드

 

즉. 메소트호출쪽은 호출되는메소드를 직접 부르는 것이 아니고 델리게이트를 대신 부르게 됩니다.

 

이처럼 중간자(대리자)역활을 합니다.

 

2. 왜 사용하는지

한마디로 유연성입니다.

저도 첨에책으로만 볼땐 그래서 머! 걍호출하면 되지 웨 써 복잡하게라고 생각했었습니다.

예를들어 폼위에 버튼을 올려놓고 클릭을 하게 되면 클릭이벤트로 가게되죠?

이건 마소에서 처음 .net을 개발할때 버튼콘트롤 소스하고 버튼클릭이벤트메소드(예:button1_Click)

를 델리게이트로 연결했기 때문에 우리가 볼땐 콘트롤을 누르면 이벤트메소드로 가는것처럼 보이는겁니다.

뒤에서는 델리게이트가 중간에 연결을 해주고 있죠!

좀이해가 안가시죠. 그럼 어디에 사용하는지 한번 보죠.

 

3. 어디에 사용하는지

이걸 응용하자면 엄청 많을 것 같은데..

1..한번에 10개의 매소드를 실행하고 싶을때.

    10개의 메소드를 전부 호출하는 것이 아니고.

    델리게이트를 걸어서 델리게이트를 한번호출합니다.

  

2..비동기처리에 사용합니다.

    예를들어 어떤 이벤트가 발생되서 실행되는

    A라는 메소드가 있는데 이놈은 한번 실행하면 최소 10분이상걸리는 놈입니다.]

    보통 델리게이트를 사용하지 않았을 경우 이놈이 끝날때까지 기다린후,다른 처리를 하게되는데.

    델리게이트걸어 비동기화 시켜주게되면 일단 실행이 되고,

    실행이 끝나던말든 다음처리를 할수 있습니다.

    이걸,멀티캐스팅이라고 하나요.

 

  ↓비동기처리의 예  

 using System;

delegate void ShowMessageDelegate(string msg);

class Callable {
  internal void ConcreteShowMessage(string msg) {
    System.Threading.Thread.Sleep(5 * 1000);
    Console.WriteLine(msg);
  }
}

class Caller {
  internal ShowMessageDelegate ShowMessage;

  internal IAsyncResult CallDelegate() {
 
    IAsyncResult ret
        = ShowMessage.BeginInvoke("hello, from delegate!",
            new AsyncCallback(Callback), ShowMessage);
    return ret;
  }

  internal void Callback(IAsyncResult ar) {
    ShowMessageDelegate usedDelegate
        = (ShowMessageDelegate)ar.AsyncState;
    usedDelegate.EndInvoke(ar);
  }
}

class App {
  static void Main() {
    Callable callable = new Callable();
    Caller caller = new Caller();

    caller.ShowMessage
        = new ShowMessageDelegate(callable.ConcreteShowMessage);

    IAsyncResult ar = caller.CallDelegate();

    while(!ar.IsCompleted) {
      System.Threading.Thread.Sleep(500);
      Console.Write(".");
    }
    Console.WriteLine("Done.");
  }
}



출처 : 네이버 아이디: dgnom878

'.NET > C#' 카테고리의 다른 글

직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Catch(Exception)  (0) 2010.03.25
Delegate  (0) 2010.03.25
Foreach문  (0) 2010.03.24
사칙연산 프로그램  (0) 2010.03.24
Posted by 아몰라

댓글을 달아 주세요

이전버튼 1 이전버튼