«Обратный вызов» - это термин, который относится к шаблону проектирования кодирования, доступному на любом языке с указателями на функции, или аналогу указателям на функции (что-то вроде делегата)
В этом паттерне вы передаете указатель на функцию другой функции, чтобы внутри вызываемой функции она могла «отозвать» функцию, которую вы ей передали. Таким образом, вы можете контролировать большую часть внутреннего поведения метода извне метода, передавая указатели на разные функции «обратного вызова» каждый раз, когда вы вызываете его ... Примером обратного вызова является наличие алгоритма сортировки для этого необходимо передать указатель на функцию, которая будет «сравнивать» любую произвольную пару объектов в списке для сортировки, чтобы определить, какой из них предшествует другому. При одном вызове метода sort вы можете передать функцию обратного вызова, которая сравнивает по имени объекта, а в другой раз передать функцию, которая сравнивает по весу объекта или как угодно ...
Делегат, otoh, является конкретным типом .Net, который действует как контейнер для сигнатуры для указателя функции ... В управляемом коде .Net делегаты являются единственным способом создания и использования указателя функции. Таким образом, в .Net для выполнения обратного вызова вы фактически передаете делегата ... Но делегаты могут использоваться в других сценариях, кроме обратных вызовов. (в частности, делегаты могут также использоваться для реализации многопоточности из пула потоков .Net)
Обратные вызовы также используются для реализации шаблона «наблюдатель» (реализован в .Net с использованием событий, которые сами по себе являются специальным типом делегата)