2010-04-13 6 views
5

콜백 코딩을 C#에서 시작했고 이벤트 배선에 대리자를 사용했지만 콜백을 사용할 기회가 없었습니다. 콜백의 실제 적용은 무엇입니까? C++ 전제 조건없이 직접 콜백에 대해 설명하는 링크를 제공 할 수 있다면 고맙겠습니다.콜백 C#

+0

내 대답이 도움이 되었습니까? 그렇다면 답변으로 표시하십시오. 감사. – gehho

+0

안녕 다니엘, 응답을 선택하고 대답으로 표시 할 수 있습니까? –

답변

9

콜백은 실제로 대리자, 즉 함수에 대한 참조입니다. 콜백은 종종 비동기 작업이 완료되면 호출자에게 알리기 위해 비동기 (멀티 스레드) 시나리오에서 사용됩니다. 비동기 메서드는 매개 변수로 콜백/위임을 가져오고 작업이 끝난 후이 델리게이트를 호출합니다 (즉 ). 뒤 ". 콜백/위임을 사용하면 호출자가 매개 변수를 전달하기 때문에 호출 된 작업을 결정할 수 있습니다.

예 :
사용자가 버튼을 클릭하여 장기 실행 작업을 시작, 당신이 WaitCursor에 마우스 포인터를 설정하고 다른 스레드에서 장기 실행 작업을 시작할 수 있습니다. 이제 마우스 포인터를 언제 정상적인 ArrowCursor로 재설정 할 수 있는지 어떻게 알 수 있습니까? 답변 : 콜백 사용. 커서를 화살표로 다시 설정 한 다음이 메서드에 대한 참조 (대리자)를 콜백 매개 변수로 전달하는 메서드를 만들면됩니다. 그런 다음이 메서드는 작업이 끝나고 커서가 다시 설정되면 호출됩니다.

실제로 이벤트는 일종의 콜백입니다. 특정 이벤트가 발생할 때 알림을받을 대리자를 등록합니다. 이 이벤트가 발생하면 은 제공된 대표를 사용하여으로 다시 전화합니다.

1

모든 비동기 작업은 콜백에 의존합니다.

1

콜백은 대리인이 함수 포인터입니다. 나는 스레드가 콜백을위한 전제 조건이라고 생각하지 않는다.

0

이들은 비 활동의 결과를 캡처하는 데 사용됩니다.

1

WPF에 익숙하다면 좋은 예가 종속성 속성입니다. 당신은 DependencyProperty.Register를 사용하여 다음 등록 :

public static DependencyProperty Register(
    string name, 
    Type propertyType, 
    Type ownerType, 
    PropertyMetadata typeMetadata, 
    ValidateValueCallback validateValueCallback 
) 

는 마지막 매개 변수로서, 당신은 몇 가지 작업이 필요로 할 때 프레임 워크에 의해 라고 당신가 (값의 유효성을 검사) 할 수있는 기능을 전달합니다.

0

대리인은 콜백 후보로 이상적인 방법에 대한 참조를 보유합니다.

간단한 예를 들어 설명해 보겠습니다. Meditor 클래스는 컨트롤러가 로그인 할 수있는 채팅 서버처럼 작동합니다. 통신하기 위해, 컨트롤러는 콜백 메소드로 작동 할 메소드를 구현해야합니다.

public class Mediator 
    { 
     //instruct the robot to move. 
     public delegate void Callback(string sender, string receiver, Message msg); 


     Callback sendMessage; 

     //Assign the callback method to the delegate   
     public void SignOn(Callback moveMethod) 
     { 
      sendMessage += moveMethod; 
     } 

     public void SendMessage(string sender, string receiver, string msg) 
     { 
      sendMessage(sender, receiver, msg); 
     } 
    } 


public class Controller : Asset 
    { 
     string readonly _name; 
     Mediator _mediator; 
     public Controller(Mediator m, string name) 
     { 
       _name = name; 
      _mediator = m; 
      //assign the call back method 
      _mediator.SignOn(Notification); 
     } 

     public void Notification(string sender, string receiver, string msg) 
     { 
      if (receiver == _name) 
      { 
       Console.WriteLine("{0}: Message for {1} - {2}".FormateText(sender, 
       receiver, msg)); //I have create extension method for FormatText. 
      } 
     } 

     public void Mobilize(string receiver, string msg) 
     { 
       _mediator.SendMessage(_name, receiver, msg); 
     } 

    } 

static void Main(string[] args) 
{ 

    Mediator mediator; 
    mediator = new Mediator(); 

    //accept name here... 

    Controller controller1 = new Controller(mediator, "name1"); 
    Controller controller2 = new Controller(mediator, "name2"); 
    controller1.Mobilize("name2","Hello"); 
    controller1.Mobilize("name1", "How are you?"); 
} 

output will be: 

name1: Message for name2 - Hello 
name2: Message for name1 - How are you?