Що таке зворотній дзвінок?


139

Що таке зворотний виклик і як він реалізований у C #?


Ви посилаєтесь на зворотні виклики ASP.Net або делегували параметри зворотного дзвінка?
СЛАКС

8
Це може означати низку речей - в якому контексті ви це чули?
UpTheCreek

1
Я думаю, що він говорить про асинхрон. Зворотний виклик
Джордж Джонстон,

8
-1 Питання незрозуміле (недостатньо деталей).
серхіо

1
Вам слід задати Google для остаточних питань.
Озгур Догус

Відповіді:


123

У комп'ютерному програмуванні зворотний виклик - це виконуваний код, який передається як аргумент іншому коду.

- Вікіпедія: зворотний виклик (інформатика)

Для цього в C # є делегати . Вони активно використовуються для подій , оскільки подія може автоматично викликати певну кількість приєднаних делегатів (обробників подій).


10
насправді зворотний виклик - це вказівник на виконуваний код, який передається як аргумент іншому коду ... Сторінка потребує перегляду
Gianluca Ghettini

8
@G_G: Ніщо не говорить про те, що це повинно бути вказівником. Зазвичай це тому, що сегмент даних не виконується, але це технічно детальна реалізація.
Joey

Joey: ти маєш рацію, це детальна інформація про реалізацію, але навіть зворотний виклик - це деталь реалізації. Ви можете переписати свій код без usino одного зворотного дзвінка. Це як "поки" проти "за".
Джанлука Геттіні

1053

Я щойно зустрічав тебе,
І це божевільно,
Але ось мій номер (делегат),
Тож якщо щось трапиться (подія),
зателефонуй мені, можливо (зворотний дзвінок)?


33
Цілком круте пояснення. Я буду використовувати це пояснення, коли хтось запитає, сподіваюся, що я можу отримати права користуватися ним?
Микола Давидович

15
+1: Полюби. Це розорить пісню, але в ній слід сказати: "Але ось мій номер та вказівки щодо використання певного типу телефону (делегата)"
Пройшло кодування

8
Дізнайтеся, делегат із посмішкою на обличчі :-)
Аакаш

8
Найкраще пояснення будь-коли!
zhengtonic

3
Зауважте, що викладання делегата іншим людям з цим поясненням працює лише з хорошою хореографією :)
Sébastien 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 до делегата дитини?
BKSpurgeon

1
Посилання @serhio мертве.
Джуд

10

Зворотний виклик - покажчик функції, який ви передаєте іншій функції. Функція, яку ви викликаєте, буде "зворотним дзвінком" (виконати) іншу функцію, коли вона буде завершена.

Перевірте це посилання.


2
Зворотний виклик може бути реалізований як делегат методу, але ви однаковою мірою можете сказати, що передача об'єкта, який підтримує метод зворотного дзвінка, в його інтерфейс - це зворотний виклик.
Джо

Array.Sort (arrayObject); виклик obj.CompareTo (elseObj) для елементів arrayObject - класичний приклад зворотного виклику за допомогою інтерфейсу (ICompareable) у .Net.
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 #.
Адам

Привіт Адам, Дякую за Вашу відповідь. Я створив код, щоб реалізувати кумедне пояснення, надане LightStriker. Ми передаємо делегат (номер) методу (MetYourCrush). Якщо в методі (MetYourCrush) трапляється Зацікавлений (подія), він викличе делегата (число), який містив посилання методу CallMeBack. Отже, буде викликаний метод CallMeBack. В основному ми передаємо делегата для виклику методу зворотного виклику. Будь ласка, повідомте мене, якщо у вас є якісь питання.
Мані

1

Можливо, це не визначення словника, але зворотний виклик зазвичай посилається на функцію, яка є зовнішньою для певного об'єкта, яка зберігається і потім викликається певною подією.

Прикладом може бути, коли створена кнопка інтерфейсу користувача, вона зберігає посилання на функцію, яка виконує дію. Дія керується іншою частиною коду, але при натисканні кнопки викликається зворотний виклик, і це викликає виконання дії.

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) з функції виклику інтерфейсу Onclient клацніть функцію javascript для виклику для EX: - builpopup(p1,p2,p3...)

var finalfield = p1, p2, p3; UseCallBack(finalfield, ""); дані клієнта передаються на сторону сервера за допомогою UseCallBack

2) public void RaiseCallbackEvent(string eventArgument) У eventArgument ми отримуємо передані дані // виконуємо деяку операцію на стороні сервера і переходимо до "callbackResult"

3) GetCallbackResult() // за допомогою цього методу дані будуть передані на клієнтську (функцію ReceiveServerData ()) сторони

callbackResult

4) Отримайте дані на стороні клієнта: ReceiveServerData(text) у відповіді текстового сервера ми отримаємо.


0

Делегати роблять те саме, що і зворотні виклики на основі інтерфейсу в C ++ (COM використовує ці), хоча вони набагато простіші.

Зауважте, що Microsoft вводить делегатів у свою реалізацію Java (J ++), але Sun їм не подобається [java.sun.com], тому не сподівайтесь незабаром побачити їх в офіційній версії Java. Я зламав препроцесора разом, щоб дозволити вам використовувати їх у C ++, тому не відчувайте уваги, якщо ви не програмуєте на C # або на платформі .NET (тобто в керованому 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 ++, але створюють трохи менше проблем, тому що вам не потрібно турбуватися з приводу іменування своїх функцій або створення допоміжних об'єктів, і ви можете робити делегатів з будь-якого методу. Вони більш гнучкі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.