Я начал кодировать в C# и никогда не имел возможности использовать обратные вызовы, хотя я использовал делегатов к проводному соединению события. Каково реальное приложение обратных вызовов. Я был бы благодарен, если Вы могли бы дать некоторую ссылку, которая объясняет об обратных вызовах прямым способом без предпосылок C++.
Обратный вызов на самом деле является делегатом, то есть ссылкой на функцию. Обратные вызовы часто используются в асинхронных (многопоточных) сценариях для уведомления вызывающей стороны о завершении асинхронной операции: асинхронный метод получает обратный вызов / делегат в качестве параметра и вызывает этот делегат после того, как он завершил свою работу, то есть он "перезванивает" . Использование обратных вызовов / делегатов позволяет вызывающему абоненту решить, какая операция вызывается, поскольку он передает параметры.
Пример:
Когда пользователь запускает длительную операцию, щелкнув кнопку, вы можете установить указатель мыши на WaitCursor и запустить длительную операцию в другом потоке. Как узнать, можно ли вернуть указатель мыши к обычному ArrowCursor? Ответ: с помощью обратных вызовов. Вы просто создаете метод, который сбрасывает курсор на стрелку, а затем передаете ссылку на этот метод (делегат) в качестве параметра обратного вызова. Затем этот метод вызывается, когда операция завершается, и ваш курсор сбрасывается.
Фактически, события также являются своего рода обратными вызовами: вы регистрируете делегата, который будет уведомлен при наступлении определенного события. Когда это событие происходит, вам перезвонят с использованием предоставленного делегата.
Делегат содержит ссылку на метод, который делает его идеальным кандидатом для обратного вызова.
Я попытался объяснить это на простом примере: Класс Meditor действует как чат-сервер, на котором контроллеры могут входить в систему. Для связи контроллеры должны реализовать метод, который будет действовать как метод обратного вызова.
public class Mediator
{
//instruct the robot to move.
public delegate void Callback(string sender, string receiver, Message msg);
Callback sendMessage;
//Assign the callback method to the delegate
public void SignOn(Callback moveMethod)
{
sendMessage += moveMethod;
}
public void SendMessage(string sender, string receiver, string msg)
{
sendMessage(sender, receiver, msg);
}
}
public class Controller : Asset
{
string readonly _name;
Mediator _mediator;
public Controller(Mediator m, string name)
{
_name = name;
_mediator = m;
//assign the call back method
_mediator.SignOn(Notification);
}
public void Notification(string sender, string receiver, string msg)
{
if (receiver == _name )
{
Console.WriteLine("{0}: Message for {1} - {2}".FormateText(sender,
receiver, msg)); //I have create extension method for FormatText.
}
}
public void Mobilize(string receiver, string msg)
{
_mediator.SendMessage(_name, receiver, msg);
}
}
static void Main(string[] args)
{
Mediator mediator;
mediator = new Mediator();
//accept name here...
Controller controller1 = new Controller(mediator, "name1");
Controller controller2 = new Controller(mediator, "name2");
controller1.Mobilize("name2","Hello");
controller1.Mobilize("name1", "How are you?");
}
output will be:
name1: Message for name2 - Hello
name2: Message for name1 - How are you?
Любое асинхронное действие будет полагаться на обратный вызов.
Обратный вызов - это делегат, это указатель на функцию. Я не думаю, что потоки являются обязательным условием для обратных вызовов.
Если вы знакомы с WPF, хорошим примером являются свойства зависимости. Затем вы регистрируетесь, используя DependencyProperty.Register :
public static DependencyProperty Register(
string name,
Type propertyType,
Type ownerType,
PropertyMetadata typeMetadata,
ValidateValueCallback validateValueCallback
)
В качестве последнего параметра вы передаете свою функцию , которая вызывается структурой , когда требуется некоторая работа необходимо сделать (проверка значения).
Они используются для фиксации результатов асинхронного действия.