콜백이란 무엇이며 C #에서 어떻게 구현됩니까?
콜백이란 무엇이며 C #에서 어떻게 구현됩니까?
답변:
C #에는 이러한 목적을위한 대리자 가 있습니다. 이벤트 는 많은 첨부 된 델리게이트 (이벤트 핸들러)를 자동으로 호출 할 수 있으므로 events 와 함께 많이 사용됩니다 .
방금 당신을 만났는데,
이건 미쳤지
만 여기에 내 전화 번호 (대리인)
가 있습니다. 어떤 일이 발생하면 (이벤트),
전화주세요.
콜백은 프로세스가 특정 작업을 수행 할 때 호출되는 함수입니다.
콜백 사용법은 일반적으로 비동기 논리입니다.
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));
}
콜백은 다른 코드에 인수로 전달되는 실행 코드입니다.
// 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
연결
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
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
메소드가 호출됩니다. 기본적으로 콜백 메소드를 호출하기 위해 델리게이트를 전달합니다.
궁금한 점이 있으면 알려주세요.
콜백 작업 단계 :
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)
텍스트 서버 응답에서 우리는 얻을 것이다.
델리게이트는 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 ++의 인터페이스 기반 콜백과 동일한 기능을 수행하지만 함수의 이름을 지정하거나 도우미 객체를 만드는 것에 대해 걱정할 필요가 없으므로 모든 메서드에서 대리자를 만들 수 있으므로 약간의 문제가 발생합니다. 더 유연합니다.