Co to jest oddzwonienie?

139

Co to jest wywołanie zwrotne i jak jest zaimplementowane w języku C #?

krzywka
źródło
Czy odnosisz się do wywołań zwrotnych ASP.Net lub delegowania parametrów wywołania zwrotnego?
SLaks
8
Może to oznaczać wiele rzeczy - w jakim kontekście to słyszałeś?
UpTheCreek
1
Myślę, że mówi o Async. Callback
George Johnston
8
-1 Pytanie jest niejasne (za mało szczegółów).
serhio
1
W przypadku ostatecznych pytań należy zapytać Google.
Ozgur Dogus

Odpowiedzi:

123

W programowaniu komputerowym wywołanie zwrotne to kod wykonywalny, który jest przekazywany jako argument do innego kodu.

- Wikipedia: Callback (informatyka)

C # ma do tego delegatów . Są intensywnie używane ze zdarzeniami , ponieważ zdarzenie może automatycznie wywołać pewną liczbę dołączonych delegatów (programów obsługi zdarzeń).

Joey
źródło
10
faktycznie zwrotna jest wskaźnik do kodu wykonywalnego, który jest przekazywany jako argument do innego kodu ... strona wymaga przeglądu
Gianluca Ghettini
8
@G_G: Nic nie mówi, że musi to być wskaźnik. Zwykle dzieje się tak, ponieważ segment danych nie jest wykonywalny, ale technicznie jest to szczegół implementacji.
Joey,
Joey: masz rację, to szczegół implementacji, ale nawet wywołanie zwrotne jest szczegółem implementacji. Możesz przepisać swój kod bez użycia jednego wywołania zwrotnego. To jest jak „podczas” kontra „za”.
Gianluca Ghettini,
1053

Właśnie cię poznałem,
I to jest szalone,
Ale oto mój numer (delegat),
Więc jeśli coś się stanie (zdarzenie)
, może zadzwoń do mnie (oddzwonienie)?

LightStriker
źródło
33
Całkowicie fajne wyjaśnienie. Skorzystam z tego wyjaśnienia za każdym razem, gdy ktoś zapyta, czy mam nadzieję, że uzyskam prawo do korzystania z niego?
Nikola Davidovic
15
+1: Uwielbiam to. To psuje piosenkę, ale powinno brzmieć: `` Ale oto mój numer i instrukcje dotyczące korzystania z określonego typu telefonu (delegata) ''
Gone Coding
8
Naucz się delegata z uśmiechem na twarzy :-)
Aakash
8
Najlepsze wyjaśnienie w historii!
zhengtonic,
3
Zwróć uwagę, że uczenie delegata innych osób z tym wyjaśnieniem działa tylko z dobrą choreografią :)
Sébastien Sevrin
87

Callback to funkcja, która zostanie wywołana, gdy proces zakończy wykonywanie określonego zadania.

Użycie wywołania zwrotnego odbywa się zwykle w logice asynchronicznej.

Aby utworzyć wywołanie zwrotne w C #, musisz przechowywać adres funkcji w zmiennej. Osiąga się to za pomocą delegatelub nowej semantyki lambda Funclub 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);
    }

W dzisiejszym C # można to zrobić za pomocą lambdy:

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

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }
Pierre-Alain Vigeant
źródło
49

Definicja

Zwrotna jest kod wykonywalny, który jest przekazywany jako argument do innego kodu.

Realizacja

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

Stosowanie

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

Spinki do mankietów

serhio
źródło
2
cześć @serhio, dziękuję za odpowiedź. nadal jest to dla mnie trochę niejasne: gdzie dokładnie kod jest przekazywany jako argument do innego kodu. Wydaje się, że jest to dodanie metody Peter.Read do delegata dziecka?
BKSpurgeon
1
Link @serhio nie działa.
Jude
10

Funkcja zwrotna to wskaźnik funkcji, który przekazujesz do innej funkcji. Funkcja, którą wywołujesz, „oddzwoni” (wykona) inną funkcję po jej zakończeniu.

Sprawdź ten link.

TLiebe
źródło
2
Wywołanie zwrotne można zaimplementować jako delegat metody, ale można również powiedzieć, że przekazanie obiektu, który obsługuje metodę wywołania zwrotnego w swoim interfejsie, jest wywołaniem zwrotnym.
Joe
Array.Sort (arrayObject); wywołanie obj.CompareTo (anotherObj) na elementach arrayObject jest klasycznym przykładem wywołania zwrotnego przy użyciu Interface (ICompareable) w .Net.
Ron5504
8

Jeśli odnosisz się do wywołań zwrotnych ASP.Net:

W modelu domyślnym dla stron sieci Web ASP.NET użytkownik wchodzi w interakcję ze stroną i klika przycisk lub wykonuje inną akcję, która powoduje ogłaszanie zwrotne. Strona i jej kontrolki są ponownie tworzone, kod strony jest uruchamiany na serwerze, a nowa wersja strony jest renderowana w przeglądarce. Jednak w niektórych sytuacjach przydatne jest uruchamianie kodu serwera z poziomu klienta bez wykonywania ogłaszania zwrotnego. Jeśli skrypt klienta na stronie zachowuje pewne informacje o stanie (na przykład lokalne wartości zmiennych), opublikowanie strony i pobranie jej nowej kopii niszczy ten stan. Ponadto ogłaszanie zwrotne strony wprowadza narzut przetwarzania, który może zmniejszyć wydajność i zmusić użytkownika do czekania na przetworzenie i ponowne utworzenie strony.

Aby uniknąć utraty stanu klienta i nie ponosić obciążenia związanego z przetwarzaniem w obie strony serwera, można zakodować stronę sieci Web ASP.NET tak, aby mogła wykonywać wywołania zwrotne klienta. W wywołaniu zwrotnym klienta funkcja skryptu klienta wysyła żądanie do strony sieci Web ASP.NET. Strona internetowa działa w zmodyfikowanej wersji swojego normalnego cyklu życia. Strona jest inicjowana, tworzone są jej kontrolki i inni członkowie, a następnie wywoływana jest specjalnie oznaczona metoda. Metoda wykonuje zakodowane przez użytkownika przetwarzanie, a następnie zwraca do przeglądarki wartość, którą może odczytać inna funkcja skryptu klienta. Przez cały ten proces strona jest aktywna w przeglądarce.

Źródło: http://msdn.microsoft.com/en-us/library/ms178208.aspx

Jeśli odnosisz się do callbacków w kodzie:

Wywołania zwrotne są często delegatami do metod, które są wywoływane po zakończeniu określonej operacji lub wykonaniu akcji podrzędnej. Często znajdziesz je w operacjach asynchronicznych. Jest to zasada programowania, którą można znaleźć w prawie każdym języku programowania.

Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/ms173172.aspx

Zyphrax
źródło
4

Dedykacja dla LightStriker:
Przykładowy kod:

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

Objaśnienie kodu:

Stworzyłem kod, aby zaimplementować zabawne wyjaśnienie dostarczone przez LightStriker w jednej z powyższych odpowiedzi. Przekazujemy delegata (liczba) do metody ( MetYourCrush). Jeśli Zainteresowane (zdarzenie) wystąpi w method ( MetYourCrush), to wywoła delegata (numer), który trzymał odwołanie do CallMeBackmetody. Tak więc CallMeBackmetoda zostanie wywołana. Zasadniczo przekazujemy delegata do wywołania metody callback.

Daj mi znać, jeśli masz jakieś pytania.

Mani
źródło
To nie jest wystarczającą odpowiedzią na pytanie, czy możesz wyjaśnić, co robi Twój kod, opisać, jak działa wywołanie zwrotne i jak jest zaimplementowane w C #.
Adam
Cześć Adam, Dzięki za twoją odpowiedź. Stworzyłem kod, aby zaimplementować zabawne wyjaśnienie dostarczone przez LightStriker. Przekazujemy delegata (liczba) do metody (MetYourCrush). Jeśli Zainteresowany (zdarzenie) wystąpi w metodzie (MetYourCrush), to wywoła delegata (numer), który trzymał odwołanie do metody CallMeBack. Tak więc zostanie wywołana metoda CallMeBack. Zasadniczo przekazujemy delegata do wywołania metody callback. Daj mi znać, jeśli masz jakieś pytania.
Mani
1

Prawdopodobnie nie jest to definicja słownikowa, ale wywołanie zwrotne zwykle odnosi się do funkcji, która jest zewnętrzna w stosunku do określonego obiektu, jest przechowywana, a następnie wywoływana po określonym zdarzeniu.

Przykładem może być utworzenie przycisku interfejsu użytkownika, który przechowuje odniesienie do funkcji, która wykonuje akcję. Akcja jest obsługiwana przez inną część kodu, ale po naciśnięciu przycisku wywoływana jest funkcja zwrotna, która wywołuje akcję do wykonania.

C #, zamiast używać terminu „callback” „wydarzenia” i „używa delegatów” i można dowiedzieć się więcej o delegatów tutaj .

Antony Woods
źródło
0

Funkcja zwrotna umożliwia przekazanie kodu wykonywalnego jako argumentu do innego kodu. W C i C ++ jest to zaimplementowane jako wskaźnik funkcji. W .NET można użyć delegata do zarządzania wskaźnikami funkcji.

Kilka zastosowań obejmuje sygnalizację błędów i kontrolowanie, czy funkcja działa, czy nie.

Wikipedia

David
źródło
0

kroki oddzwaniania:

1) musimy zaimplementować ICallbackEventHandlerinterfejs

2) Zarejestruj skrypt klienta:

 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) z wywołania interfejsu użytkownika Onclient kliknij wywołanie funkcji javascript dla EX: - builpopup(p1,p2,p3...)

var finalfield = p1, p2, p3; UseCallBack(finalfield, ""); dane z klienta przekazane do serwera przy użyciu UseCallBack

2) public void RaiseCallbackEvent(string eventArgument) W eventArgument otrzymujemy przekazane dane // wykonujemy jakąś operację po stronie serwera i przekazujemy do "callbackResult"

3) GetCallbackResult() // używając tej metody dane zostaną przekazane do klienta (funkcja ReceiveServerData ())

callbackResult

4) Pobierz dane po stronie klienta: ReceiveServerData(text) w odpowiedzi serwera tekstowego otrzymamy.

Ganesha
źródło
0

Delegaci robią to samo, co wywołania zwrotne oparte na interfejsach w C ++ (COM ich używa), chociaż są znacznie prostsze w użyciu.

Zwróć uwagę, że Microsoft umieścił delegatów w swojej implementacji Java (J ++), ale Sun ich nie lubi [java.sun.com], więc nie spodziewaj się, że wkrótce zobaczymy ich w oficjalnej wersji Java. Zhakowałem razem preprocesor, abyś mógł używać ich w C ++, więc nie czuj się pominięty, jeśli nie programujesz w C # lub na platformie .NET (tj. W Managed C ++ lub Visual Basic.NET).

Jeśli jesteś przyzwyczajony do funkcji wskaźników w C, delegat to w zasadzie para wskaźników połączona w jeden:

  • Wskaźnik do obiektu (opcjonalnie)
  • Wskaźnik do metody tego obiektu

Oznacza to, że pojedynczy delegat przekazuje wszystkie informacje potrzebne do zlokalizowania funkcji w programie, niezależnie od tego, czy jest to metoda statyczna, czy też powiązana z obiektem.

Definiujesz je w ten sposób w C #:

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

Chcąc z nich skorzystać, musisz usunąć delegata z funkcji, którą chcesz wywołać:

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

Jeśli chcesz, aby delegat wskazywał metodę statyczną, wygląda to tak samo:

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

Podsumowując, robią to samo, co wywołania zwrotne oparte na interfejsach w C ++, ale powodują nieco mniej problemów, ponieważ nie musisz martwić się o nazwanie swoich funkcji lub tworzenie obiektów pomocniczych, a możesz delegować dowolną metodę. Są bardziej elastyczne.

Gomathi
źródło