Що таке зворотний виклик і як він реалізований у C #?
Що таке зворотний виклик і як він реалізований у C #?
Відповіді:
У комп'ютерному програмуванні зворотний виклик - це виконуваний код, який передається як аргумент іншому коду.
Для цього в C # є делегати . Вони активно використовуються для подій , оскільки подія може автоматично викликати певну кількість приєднаних делегатів (обробників подій).
Я щойно зустрічав тебе,
І це божевільно,
Але ось мій номер (делегат),
Тож якщо щось трапиться (подія),
зателефонуй мені, можливо (зворотний дзвінок)?
Зворотний виклик - це функція, яка буде викликана, коли виконується процес виконання певного завдання.
Використання зворотного дзвінка зазвичай в асинхронній логіці.
Щоб створити зворотний дзвінок у 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
метод буде називатися. В основному ми передаємо делегата для виклику методу зворотного виклику.
Будь ласка, повідомте мене, якщо у вас є якісь питання.
Можливо, це не визначення словника, але зворотний виклик зазвичай посилається на функцію, яка є зовнішньою для певного об'єкта, яка зберігається і потім викликається певною подією.
Прикладом може бути, коли створена кнопка інтерфейсу користувача, вона зберігає посилання на функцію, яка виконує дію. Дія керується іншою частиною коду, але при натисканні кнопки викликається зворотний виклик, і це викликає виконання дії.
C # замість терміна "зворотний виклик" використовує "події" та "делегати", і ви можете дізнатися більше про делегатів тут .
Зворотний виклик дозволяє передавати виконуваний код як аргумент іншому коду. У C і C ++ це реалізується як покажчик функції. У .NET ви б використовували делегата для управління покажчиками функцій.
Кілька застосувань включають сигналізацію про помилки та контроль того, чи функція діє чи ні.
Робочі дії щодо зворотного виклику:
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)
у відповіді текстового сервера ми отримаємо.
Делегати роблять те саме, що і зворотні виклики на основі інтерфейсу в 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 ++, але створюють трохи менше проблем, тому що вам не потрібно турбуватися з приводу іменування своїх функцій або створення допоміжних об'єктів, і ви можете робити делегатів з будь-якого методу. Вони більш гнучкі.