Обратные вызовы в C#

Я начал кодировать в C# и никогда не имел возможности использовать обратные вызовы, хотя я использовал делегатов к проводному соединению события. Каково реальное приложение обратных вызовов. Я был бы благодарен, если Вы могли бы дать некоторую ссылку, которая объясняет об обратных вызовах прямым способом без предпосылок C++.

5
задан Daniel Daranas 13 April 2010 в 10:25
поделиться

6 ответов

Обратный вызов на самом деле является делегатом, то есть ссылкой на функцию. Обратные вызовы часто используются в асинхронных (многопоточных) сценариях для уведомления вызывающей стороны о завершении асинхронной операции: асинхронный метод получает обратный вызов / делегат в качестве параметра и вызывает этот делегат после того, как он завершил свою работу, то есть он "перезванивает" . Использование обратных вызовов / делегатов позволяет вызывающему абоненту решить, какая операция вызывается, поскольку он передает параметры.

Пример:
Когда пользователь запускает длительную операцию, щелкнув кнопку, вы можете установить указатель мыши на WaitCursor и запустить длительную операцию в другом потоке. Как узнать, можно ли вернуть указатель мыши к обычному ArrowCursor? Ответ: с помощью обратных вызовов. Вы просто создаете метод, который сбрасывает курсор на стрелку, а затем передаете ссылку на этот метод (делегат) в качестве параметра обратного вызова. Затем этот метод вызывается, когда операция завершается, и ваш курсор сбрасывается.

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

9
ответ дан 13 December 2019 в 05:32
поделиться

Делегат содержит ссылку на метод, который делает его идеальным кандидатом для обратного вызова.

Я попытался объяснить это на простом примере: Класс 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?
0
ответ дан 13 December 2019 в 05:32
поделиться

Любое асинхронное действие будет полагаться на обратный вызов.

1
ответ дан 13 December 2019 в 05:32
поделиться

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

1
ответ дан 13 December 2019 в 05:32
поделиться

Если вы знакомы с WPF, хорошим примером являются свойства зависимости. Затем вы регистрируетесь, используя DependencyProperty.Register :

public static DependencyProperty Register(
    string name,
    Type propertyType,
    Type ownerType,
    PropertyMetadata typeMetadata,
    ValidateValueCallback validateValueCallback
)

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

1
ответ дан 13 December 2019 в 05:32
поделиться

Они используются для фиксации результатов асинхронного действия.

0
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: