콜백이란 무엇입니까?


139

콜백이란 무엇이며 C #에서 어떻게 구현됩니까?


ASP.Net 콜백 또는 위임 콜백 매개 변수를 참조하고 있습니까?
SLaks

8
그것은 여러 가지를 의미 할 수 있습니다-어떤 맥락에서 들었습니까?
UpTheCreek

1
나는 그가 비동기에 대해 이야기하고 있다고 생각합니다. 콜백
George Johnston

8
-1 질문이 명확하지 않습니다 (세부 사항이 충분하지 않음).
serhio

1
명확한 질문은 Google에 문의해야합니다.
Ozgur Dogus

답변:


123

에서 컴퓨터 프로그래밍 , 콜백은 실행 코드 로 전달되는 인수 기타 코드.

위키 백과 : 콜백 (컴퓨터 과학)

C #에는 이러한 목적을위한 대리자 가 있습니다. 이벤트 는 많은 첨부 된 델리게이트 (이벤트 핸들러)를 자동으로 호출 할 수 있으므로 events 와 함께 많이 사용됩니다 .


10
실제로 콜백은 다른 코드에 대한 인수로 전달되는 실행 코드에 대한 포인터입니다 ... 페이지는 검토가 필요합니다
Gianluca Ghettini

8
@G_G : 포인터 여야한다는 말은 없습니다. 일반적으로 데이터 세그먼트는 실행 가능하지 않기 때문에 기술적으로 구현 세부 사항입니다.
Joey

Joey : u 맞아 구현 세부 사항이지만 콜백조차도 구현 세부 사항입니다. 단일 콜백을 사용하지 않고도 코드를 다시 작성할 수 있습니다. 'while'vs 'for'와 같습니다.
Gianluca Ghettini

1053

방금 당신을 만났는데,
이건 미쳤지
만 여기에 내 전화 번호 (대리인)
가 있습니다. 어떤 일이 발생하면 (이벤트),
전화주세요.


33
완전히 멋진 설명. 나는 누군가가 요청할 때마다이 설명을 사용할 것입니다. 그것을 사용할 권리를 얻을 수 있기를 바랍니다.
Nikola Davidovic

15
+1 : 좋아합니다. 노래는 망가졌지만`여기에는 내 전화 번호와 특정 유형의 전화 (대리인) 사용 지침 '이 나와 있습니다.
Gone Coding

8
당신의 얼굴에 미소로 대표 배우기 :-)
Aakash

8
최고의 설명!
zhengtonic

3
그 설명과 함께 다른 사람에게 위임을 가르치는 만 : 좋은 안무와 함께 작동하는 것으로
세바스티앙 Sevrin

87

콜백은 프로세스가 특정 작업을 수행 할 때 호출되는 함수입니다.

콜백 사용법은 일반적으로 비동기 논리입니다.

C #에서 콜백을 만들려면 함수 주소를 변수 안에 저장해야합니다. 이것은 사용하여 달성된다 delegate또는 의미 새로운 람다 Func또는 Action.

    public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    }

    public void TestCallBack(string result)
    {
        Console.WriteLine(result);
    }

오늘 C #에서는 다음과 같은 람다를 사용하여 수행 할 수 있습니다.

    public void DoWork(Action<string> callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }

49

정의

콜백은 다른 코드에 인수로 전달되는 실행 코드입니다.

이행

// Parent can Read
public class Parent
{
    public string Read(){ /*reads here*/ };
}

// Child need Info
public class Child
{
    private string information;
    // declare a Delegate
    delegate string GetInfo();
    // use an instance of the declared Delegate
    public GetInfo GetMeInformation;

    public void ObtainInfo()
    {
        // Child will use the Parent capabilities via the Delegate
        information = GetMeInformation();
    }
}

용법

Parent Peter = new Parent();
Child Johny = new Child();

// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;

Johny.ObtainInfo(); // here Johny 'asks' Peter to read

연결


2
안녕하세요 @serhio 답변 주셔서 감사합니다. 그것은 여전히 ​​나에게 약간 어둡습니다 : 코드가 정확히 다른 코드에 대한 인수로 전달되는 위치는 Peter의 Read.Add 메서드를 자식 대리자에 추가하는 것 같습니다.
BKSpurgeon

1
@serhio 링크가 죽었습니다.
Jude

10

콜백은 다른 함수에 전달하는 함수 포인터입니다. 호출하는 함수는 다른 함수가 완료되면 '콜백'(실행)합니다.

링크를 확인하십시오 .


2
콜백은 메소드의 대리자로 구현할 수 있지만 인터페이스에서 콜백 메소드를 지원하는 객체를 전달하는 것이 콜백이라고 할 수 있습니다.
Joe

Array.Sort (arrayObject); arrayObject의 요소에서 obj.CompareTo (anotherObj)를 호출하는 것은 .Net의 인터페이스 (ICompareable)를 사용하는 전형적인 콜백 예입니다.
Ron5504

8

ASP.Net 콜백을 참조하는 경우 :

ASP.NET 웹 페이지의 기본 모델에서 사용자는 페이지와 상호 작용하고 단추를 클릭하거나 포스트 백을 발생시키는 다른 작업을 수행합니다. 페이지와 해당 컨트롤이 다시 만들어지고 페이지 코드가 서버에서 실행되고 새 버전의 페이지가 브라우저에 렌더링됩니다. 그러나 경우에 따라 포스트 백을 수행하지 않고 클라이언트에서 서버 코드를 실행하는 것이 유용합니다. 페이지의 클라이언트 스크립트가 일부 상태 정보 (예 : 로컬 변수 값)를 유지 보수하는 경우 페이지를 게시하고 새 사본을 받으면 해당 상태가 삭제됩니다. 또한 페이지 포스트 백에는 처리 오버 헤드가 발생하여 성능이 저하되고 사용자가 페이지를 처리하고 다시 만들 때까지 기다리게 할 수 있습니다.

클라이언트 상태를 잃지 않고 서버 왕복의 처리 오버 헤드가 발생하지 않도록 ASP.NET 웹 페이지를 코딩하여 클라이언트 콜백을 수행 할 수 있습니다. 클라이언트 콜백에서 클라이언트 스크립트 함수는 요청을 ASP.NET 웹 페이지로 보냅니다. 웹 페이지는 일반 수명주기의 수정 된 버전을 실행합니다. 페이지가 시작되고 해당 컨트롤과 다른 멤버가 만들어진 다음 특별히 표시된 메서드가 호출됩니다. 이 메소드는 코딩 한 처리를 수행 한 후 다른 클라이언트 스크립트 함수가 읽을 수있는 값을 브라우저에 리턴합니다. 이 과정에서 페이지는 브라우저에 표시됩니다.

출처 : http://msdn.microsoft.com/en-us/library/ms178208.aspx

코드에서 콜백을 참조하는 경우 :

콜백은 종종 특정 작업이 완료되거나 하위 작업을 수행 할 때 호출되는 메서드에 위임됩니다. 종종 비동기 작업에서 찾을 수 있습니다. 거의 모든 코딩 언어에서 찾을 수있는 프로그래밍 원칙입니다.

자세한 정보는 여기 : http://msdn.microsoft.com/en-us/library/ms173172.aspx


4

LightStriker 전용 :
샘플 코드 :

class CallBackExample
{
    public delegate void MyNumber();
    public static void CallMeBack()
    {
        Console.WriteLine("He/She is calling you.  Pick your phone!:)");
        Console.Read();
    }
    public static void MetYourCrush(MyNumber number)
    {
        int j;
        Console.WriteLine("is she/he interested 0/1?:");
        var i = Console.ReadLine();
        if (int.TryParse(i, out j))
        {
            var interested = (j == 0) ? false : true;
            if (interested)//event
            {
                //call his/her number
                number();
            }
            else
            {
                Console.WriteLine("Nothing happened! :(");
                Console.Read();
            }
        }
    }
    static void Main(string[] args)
    {
        MyNumber number = Program.CallMeBack;
        Console.WriteLine("You have just met your crush and given your number");
        MetYourCrush(number);
        Console.Read();
        Console.Read();
    }       
}

코드 설명 :

위의 답변 중 하나에서 LightStriker가 제공하는 재미있는 설명을 구현하는 코드를 만들었습니다. 델리게이트 (번호)를 메소드 ( MetYourCrush)로 전달합니다. 메소드 ( MetYourCrush) 에서 관심있는 (이벤트)가 발생하면 메소드 참조를 보유한 대리자 (번호)를 호출합니다 CallMeBack. 따라서 CallMeBack메소드가 호출됩니다. 기본적으로 콜백 메소드를 호출하기 위해 델리게이트를 전달합니다.

궁금한 점이 있으면 알려주세요.


이것은 질문에 적절하게 대답하지 못하며 코드가 수행하는 작업을 설명하고 콜백 작동 방식 및 C #에서 구현 방법을 설명 할 수 있습니까?
Adam

안녕 아담, 답장을 보내 주셔서 감사합니다. LightStriker에서 제공하는 재미있는 설명을 구현하는 코드를 만들었습니다. 델리게이트 (번호)를 메소드 (MetYourCrush)로 전달합니다. 관심있는 (이벤트)가 메소드 (MetYourCrush)에서 발생하면 CallMeBack 메소드의 참조를 보유한 대리자 (번호)를 호출합니다. 따라서 CallMeBack 메소드가 호출됩니다. 기본적으로 콜백 메소드를 호출하기 위해 델리게이트를 전달합니다. 궁금한 점이 있으면 알려주세요.
마니

1

아마도 사전 정의는 아니지만 콜백은 일반적으로 특정 객체 외부에있는 함수를 나타내며 특정 이벤트에 대해 저장되고 호출됩니다.

예를 들어 UI 버튼을 만들 때 작업을 수행하는 함수에 대한 참조가 저장됩니다. 액션은 코드의 다른 부분에 의해 처리되지만 버튼을 누르면 콜백이 호출되고 수행 할 액션이 호출됩니다.

C #은 '콜백'이라는 용어를 사용하는 대신 '이벤트'와 '위임자'를 사용하며 여기에서 델리게이트에 대해 자세히 알아볼 수 있습니다 .


0

콜백을 사용하면 실행 코드를 다른 코드의 인수로 전달할 수 있습니다. C 및 C ++에서 이것은 함수 포인터로 구현됩니다. .NET에서는 대리자를 사용하여 함수 포인터를 관리합니다.

몇 가지 용도에는 오류 신호 및 기능의 작동 여부 제어가 포함됩니다.

위키 백과


0

콜백 작업 단계 :

1) ICallbackEventHandler인터페이스 를 구현해야합니다

2) 클라이언트 스크립트를 등록하십시오.

 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript = "function UseCallBack(arg, context)" + "{ " + cbReference + ";}";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);

1) UI 호출에서 클라이언트를 클릭하면 EX에 대한 Javascript 함수를 클릭하십시오. builpopup(p1,p2,p3...)

var finalfield = p1, p2, p3; UseCallBack(finalfield, ""); UseCallBack을 사용하여 클라이언트에서 서버 측으로 전달 된 데이터

2) public void RaiseCallbackEvent(string eventArgument) eventArgument에서 우리는 전달 된 데이터를 얻습니다. // 일부 서버 측 작업을 수행하고 "callbackResult"에 전달합니다.

3) GetCallbackResult() //이 메소드를 사용하면 client (ReceiveServerData () function)쪽으로 전달됩니다.

callbackResult

4) 클라이언트 측에서 데이터를 얻는다 : ReceiveServerData(text) 텍스트 서버 응답에서 우리는 얻을 것이다.


0

델리게이트는 C ++에서 인터페이스 기반 콜백과 동일한 기능을 수행하지만 (COM에서 사용) 훨씬 사용하기는 쉽습니다.

Microsoft는 델리게이트를 Java 구현 (J ++)에 넣었지만 Sun은 [java.sun.com]을 좋아하지 않으므로 곧 공식 버전의 Java에서 볼 수는 없습니다. C ++에서 사용할 수 있도록 전처리기를 함께 해킹했기 때문에 C # 또는 .NET 플랫폼 (예 : Managed C ++ 또는 Visual Basic.NET)에서 프로그래밍하지 않아도됩니다.

C에서 포인터를 작동시키는 데 익숙하다면 대리자는 기본적으로 하나의 포인터 쌍으로 롤됩니다.

  • 객체에 대한 포인터 (선택 사항)
  • 해당 객체의 메소드에 대한 포인터

즉, 단일 대리자가 정적 메서드이든 객체와 상관없이 프로그램에서 함수를 찾는 데 필요한 모든 정보를 전달합니다.

C #에서 다음과 같이 정의하십시오.

public delegate void FooCallbackType( int a, int b, int c );

당신이 그것들을 사용하고 싶을 때, 당신은 당신이 호출하고자하는 함수에서 델리게이트를 만듭니다 :

class CMyClass
{
    public void FunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            this.FunctionToCall );
        // Now you can pass that to the function
        // that needs to call you back.
    }
}

정적 메서드를 가리 키도록 대리자를 만들려면 다음과 같습니다.

class CMyClassWithStaticCallback
{
    public static void StaticFunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public static void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            CMyClass.StaticFunctionToCall );
    }
}

대체로 C ++의 인터페이스 기반 콜백과 동일한 기능을 수행하지만 함수의 이름을 지정하거나 도우미 객체를 만드는 것에 대해 걱정할 필요가 없으므로 모든 메서드에서 대리자를 만들 수 있으므로 약간의 문제가 발생합니다. 더 유연합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.