Что такое обратный вызов?

Какой обратный вызов и как он реализован на С#?

Ответ 1

В компьютерном программировании обратный вызов - это исполняемый код, который передается в качестве аргумента другому коду.

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

С# имеет делегатов для этой цели. Они интенсивно используются с событиями, так как событие может автоматически вызывать количество прикрепленных делегатов (обработчиков событий).

Ответ 2

Я только что встретил тебя,
И это сумасшествие,
Но вот мой номер (делегат),
Итак, если что-то происходит (событие),
Позвоните мне, может быть (обратный вызов)?

Ответ 3

Обратный вызов - это функция, которая будет вызываться, когда процесс выполняется с конкретной задачей.

Использование обратного вызова обычно выполняется в асинхронной логике.

Чтобы создать обратный вызов в С#, вам нужно сохранить адрес функции внутри переменной. Это достигается с помощью 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);
    }

В сегодняшнем С# это можно сделать, используя lambda like:

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

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

Ответ 4

Определение

A callback - это исполняемый код, который передается как аргумент другому коду.

Реализация

// 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

Ссылки

Ответ 5

Обратный вызов - это указатель на функцию, который вы передаете другой функции. Функция, которую вы вызываете, будет "отвечать" (выполнить) другую функцию, когда она будет завершена.

Отметьте эту ссылку.

Ответ 6

Если вы ссылаетесь на обратные вызовы 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

Ответ 7

Посвящение 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). Если в методе (MetYourCrush) происходит Interested (событие), он вызывает делегат (номер), который содержал ссылку на метод CallMeBack. Итак, метод CallMeBack будет вызван. По сути, мы передаем делегат для вызова метода обратного вызова.

Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.

Ответ 8

Возможно, это не определение словаря, но обратный вызов обычно относится к функции, которая является внешней по отношению к определенному объекту, которая хранится, а затем вызывает конкретное событие.

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

С#, а не использовать термин "обратный вызов" использует "события" и "делегаты", и вы можете узнать больше о делегатах здесь.

Ответ 9

Обратный вызов позволяет передавать исполняемый код в качестве аргумента в другой код. В C и С++ это реализуется как указатель на функцию. В .NET вы должны использовать делегат для управления указателями функций.

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

Wikipedia

Ответ 10

Действия обратной связи:

1) мы должны реализовать ICallbackEventHandler Interface

2) Зарегистрируйте клиента script:

 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 вызова 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), в ответе текстового сервера мы получим.

Ответ 11

Делегаты делают то же самое, что и обратные вызовы на основе интерфейса в C++ (COM использует их), хотя их гораздо проще использовать.

Обратите внимание, что Microsoft помещает делегатов в свою реализацию Java (J++), но Sun их не любит [java.sun.com], поэтому не ожидайте увидеть их в официальной версии Java в ближайшее время. Я взломал препроцессор, чтобы позволить вам использовать их в C++, поэтому не стесняйтесь, если вы не программируете на С# или на платформе .NET (то есть в Managed C++ или Visual Basic.NET).

Если вы привыкли работать с указателями в 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++, но вызывают немного меньше проблем, потому что вам не нужно беспокоиться о именовании своих функций или создании вспомогательных объектов, и вы можете сделать делегатов из любого метод. Они более гибкие.