Was ist ein Rückruf?


139

Was ist ein Rückruf und wie wird er in C # implementiert?


Beziehen Sie sich auf ASP.Net-Rückrufe oder delegieren Sie Rückrufparameter?
SLaks

8
Es könnte eine Reihe von Dingen bedeuten - in welchem ​​Kontext haben Sie es gehört?
UpTheCreek

1
Ich denke, er spricht von einem Async. Rückruf
George Johnston

8
-1 Die Frage ist unklar (nicht genügend Details).
Serhio

1
Sie sollten Google nach endgültigen Fragen fragen.
Ozgur Dogus

Antworten:


123

Bei der Computerprogrammierung ist ein Rückruf ausführbarer Code , der als Argument an anderen Code übergeben wird.

- Wikipedia: Rückruf (Informatik)

C # hat zu diesem Zweck Delegierte . Sie werden häufig bei Ereignissen verwendet , da ein Ereignis automatisch eine Reihe von angehängten Delegaten (Ereignishandlern) aufrufen kann.


10
Tatsächlich ist ein Rückruf ein Zeiger auf ausführbaren Code, der als Argument an anderen Code übergeben wird. Die Seite muss überprüft werden
Gianluca Ghettini,

8
@G_G: Es gibt nichts, was besagt, dass es ein Zeiger sein muss. Dies liegt normalerweise daran, dass das Datensegment nicht ausführbar ist, dies ist jedoch technisch gesehen ein Implementierungsdetail.
Joey

Joey: Sie haben Recht, es ist ein Implementierungsdetail, aber selbst der Rückruf ist ein Implementierungsdetail. Sie können Ihren Code ohne einen einzigen Rückruf neu schreiben. Es ist wie 'while' vs 'for'.
Gianluca Ghettini

1051

Ich habe dich gerade getroffen,
und das ist verrückt,
aber hier ist meine Nummer (Delegierter).
Wenn also etwas passiert (Ereignis),
ruf mich vielleicht an (Rückruf)?


33
Total coole Erklärung. Ich werde diese Erklärung verwenden, wenn jemand fragt, hoffe ich kann Rechte bekommen, um sie zu verwenden?
Nikola Davidovic

15
+1: Ich liebe es. Es ruiniert das Lied, aber das sollte lauten: "Aber hier ist meine Nummer und die Anleitung zur Verwendung eines bestimmten Telefontyps (Delegierter)"
Gone Coding

8
Lerne Delegierten mit Lächeln im Gesicht :-)
Aakash

8
Beste Erklärung aller Zeiten!
Zhengtonic

3
Beachten Sie, dass das Unterrichten von Delegierten an andere Personen mit dieser Erklärung nur mit einer guten Choreografie funktioniert :)
Sébastien Sevrin

87

Ein Rückruf ist eine Funktion, die aufgerufen wird, wenn ein Prozess eine bestimmte Aufgabe ausführt.

Die Verwendung eines Rückrufs erfolgt normalerweise in asynchroner Logik.

Um einen Rückruf in C # zu erstellen, müssen Sie eine Funktionsadresse in einer Variablen speichern. Dies wird mit einer delegateoder der neuen Lambda-Semantik Funcoder erreicht 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);
    }

Im heutigen C # könnte dies mit Lambda wie folgt erfolgen:

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

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

48

Definition

Ein Rückruf ist ausführbarer Code, der als Argument an anderen Code übergeben wird.

Implementierung

// 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();
    }
}

Verwendung

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

Links


2
hi @serhio danke für deine antwort. Für mich ist es immer noch ein wenig trübe: Wo genau wird der Code als Argument an einen anderen Code übergeben? Scheint das Hinzufügen der Peter.Read-Methode zum Delegierten des Kindes zu sein?
BKSpurgeon

1
@serhio Link ist tot.
Judas

10

Ein Rückruf ist ein Funktionszeiger, den Sie an eine andere Funktion übergeben. Die von Ihnen aufgerufene Funktion ruft die andere Funktion zurück, wenn sie abgeschlossen ist.

Schauen Sie sich diesen Link an.


2
Ein Rückruf kann als Delegat einer Methode implementiert werden. Sie können jedoch auch sagen, dass das Übergeben eines Objekts, das eine Rückrufmethode auf seiner Schnittstelle unterstützt, ein Rückruf ist.
Joe

Array.Sort (arrayObject); Das Aufrufen von obj.CompareTo (anotherObj) für Elemente von arrayObject ist ein klassisches Beispiel für den Rückruf mithilfe der Schnittstelle (ICompareable) in .Net.
Ron5504

8

Wenn Sie sich auf ASP.Net-Rückrufe beziehen:

Im Standardmodell für ASP.NET-Webseiten interagiert der Benutzer mit einer Seite und klickt auf eine Schaltfläche oder führt eine andere Aktion aus, die zu einem Postback führt. Die Seite und ihre Steuerelemente werden neu erstellt, der Seitencode wird auf dem Server ausgeführt und eine neue Version der Seite wird im Browser gerendert. In einigen Situationen ist es jedoch hilfreich, Servercode vom Client aus auszuführen, ohne ein Postback durchzuführen. Wenn das Client-Skript auf der Seite einige Statusinformationen (z. B. lokale Variablenwerte) verwaltet, wird dieser Status durch das Posten der Seite und das Abrufen einer neuen Kopie zerstört. Darüber hinaus führen Seiten-Postbacks zu einem Verarbeitungsaufwand, der die Leistung verringern und den Benutzer dazu zwingen kann, auf die Verarbeitung und Neuerstellung der Seite zu warten.

Um zu vermeiden, dass der Clientstatus verloren geht und kein Verarbeitungsaufwand für einen Server-Roundtrip anfällt, können Sie eine ASP.NET-Webseite so codieren, dass Client-Rückrufe ausgeführt werden können. Bei einem Client-Rückruf sendet eine Client-Skript-Funktion eine Anforderung an eine ASP.NET-Webseite. Auf der Webseite wird eine geänderte Version ihres normalen Lebenszyklus ausgeführt. Die Seite wird initiiert und ihre Steuerelemente und andere Mitglieder werden erstellt. Anschließend wird eine speziell gekennzeichnete Methode aufgerufen. Die Methode führt die von Ihnen codierte Verarbeitung durch und gibt dann einen Wert an den Browser zurück, der von einer anderen Client-Skriptfunktion gelesen werden kann. Während dieses Vorgangs befindet sich die Seite im Browser.

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

Wenn Sie sich auf Rückrufe im Code beziehen:

Rückrufe sind häufig Delegaten an Methoden, die aufgerufen werden, wenn die bestimmte Operation abgeschlossen ist oder eine Unteraktion ausführt. Sie finden sie häufig in asynchronen Vorgängen. Es ist ein Programmierprinzip, das Sie in fast jeder Codierungssprache finden können.

Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/ms173172.aspx


4

Widmung an LightStriker:
Beispielcode:

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();
    }       
}

Code Erläuterung:

Ich habe den Code erstellt, um die lustige Erklärung von LightStriker in der obigen Antwort zu implementieren. Wir übergeben delegate (number) an eine method ( MetYourCrush). Wenn das Interessierte (Ereignis) in der Methode () auftritt, MetYourCrushruft es den Delegaten (Nummer) auf, der die Referenz der CallMeBackMethode enthielt. Die CallMeBackMethode wird also aufgerufen. Grundsätzlich übergeben wir den Delegaten, um die Rückrufmethode aufzurufen.

Bitte lassen Sie mich wissen, wenn Sie Fragen haben.


Dies beantwortet die Frage nicht angemessen. Können Sie erklären, was Ihr Code tut, um zu beschreiben, wie ein Rückruf funktioniert und wie er in C # implementiert ist?
Adam

Hallo Adam, Danke für deine Antwort. Ich habe den Code erstellt, um die lustige Erklärung von LightStriker zu implementieren. Wir übergeben den Delegaten (Nummer) an eine Methode (MetYourCrush). Wenn das Interessierte (Ereignis) in der Methode (MetYourCrush) auftritt, ruft es den Delegaten (Nummer) auf, der die Referenz der CallMeBack-Methode enthielt. Daher wird die CallMeBack-Methode aufgerufen. Grundsätzlich übergeben wir den Delegaten, um die Rückrufmethode aufzurufen. Bitte lassen Sie mich wissen, wenn Sie Fragen haben.
Mani

1

Wahrscheinlich nicht die Wörterbuchdefinition, aber ein Rückruf bezieht sich normalerweise auf eine Funktion, die außerhalb eines bestimmten Objekts liegt, gespeichert und dann auf ein bestimmtes Ereignis aufgerufen wird.

Ein Beispiel könnte sein, dass beim Erstellen einer UI-Schaltfläche ein Verweis auf eine Funktion gespeichert wird, die eine Aktion ausführt. Die Aktion wird von einem anderen Teil des Codes ausgeführt. Wenn jedoch die Taste gedrückt wird, wird der Rückruf aufgerufen und die auszuführende Aktion aufgerufen.

C # verwendet nicht den Begriff "Rückruf", sondern "Ereignisse" und "Delegierte". Weitere Informationen zu Delegierten finden Sie hier .


0

Mit einem Rückruf können Sie ausführbaren Code als Argument an anderen Code übergeben. In C und C ++ wird dies als Funktionszeiger implementiert. In .NET würden Sie einen Delegaten verwenden, um Funktionszeiger zu verwalten.

Einige Anwendungen umfassen die Fehlersignalisierung und die Steuerung, ob eine Funktion funktioniert oder nicht.

Wikipedia


0

Rückruf-Arbeitsschritte:

1) Wir müssen ICallbackEventHandlerInterface implementieren

2) Registrieren Sie das Client-Skript:

 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) Klicken Sie im UI-Aufruf Onclient auf Javascript-Funktion für EX aufrufen: - builpopup(p1,p2,p3...)

var finalfield = p1, p2, p3; UseCallBack(finalfield, ""); Daten vom Client werden mithilfe von UseCallBack an den Server übergeben

2) public void RaiseCallbackEvent(string eventArgument) In eventArgument erhalten wir die übergebenen Daten // führen eine serverseitige Operation durch und übergeben sie an "callbackResult"

3) GetCallbackResult() // Mit dieser Methode werden Daten an die Client-Seite (ReceiveServerData () -Funktion) übergeben

callbackResult

4) Holen Sie sich die Daten auf der Clientseite: ReceiveServerData(text) In der Antwort des Textservers erhalten wir.


0

Delegaten machen dasselbe wie schnittstellenbasierte Rückrufe in C ++ (COM verwendet diese), obwohl sie viel einfacher zu verwenden sind.

Beachten Sie, dass Microsoft Delegierte in seine Java-Implementierung (J ++) aufgenommen hat, Sun sie jedoch nicht mag [java.sun.com]. Erwarten Sie daher nicht, sie bald in der offiziellen Java-Version zu sehen. Ich habe einen Präprozessor gehackt, damit Sie sie in C ++ verwenden können. Fühlen Sie sich also nicht ausgeschlossen, wenn Sie nicht in C # oder auf der .NET-Plattform (dh in Managed C ++ oder Visual Basic.NET) programmieren.

Wenn Sie es gewohnt sind, Zeiger in C zu funktionieren, ist ein Delegat im Grunde ein Paar von Zeigern, die in einem zusammengefasst sind:

  • Ein Zeiger auf ein Objekt (optional)
  • Ein Zeiger auf eine Methode dieses Objekts

Das bedeutet, dass ein einzelner Delegat alle Informationen übergibt, die zum Auffinden einer Funktion in Ihrem Programm erforderlich sind, unabhängig davon, ob es sich um eine statische Methode handelt oder einem Objekt zugeordnet ist.

Sie definieren sie wie folgt in C #:

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

Wenn Sie sie verwenden möchten, machen Sie aus der Funktion, die Sie aufrufen möchten, einen Delegaten:

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.
    }
}

Wenn Sie einen Delegaten dazu bringen möchten, auf eine statische Methode zu verweisen, sieht es genauso aus:

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 );
    }
}

Alles in allem tun sie dasselbe wie schnittstellenbasierte Rückrufe in C ++, verursachen jedoch etwas weniger Probleme, da Sie sich nicht um die Benennung Ihrer Funktionen oder das Erstellen von Hilfsobjekten kümmern müssen und aus jeder Methode Delegaten erstellen können. Sie sind flexibler.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.