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

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

5 голосов
/ 13 апреля 2010

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

Ответы [ 6 ]

9 голосов
/ 13 апреля 2010

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

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

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

1 голос
/ 13 апреля 2010

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

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

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

1 голос
/ 13 апреля 2010

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

1 голос
/ 13 апреля 2010

Любое асинхронное действие будет основано на обратном вызове.

0 голосов
/ 13 апреля 2010

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

Я попытался объяснить это на простом примере: Класс 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 апреля 2010

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

...