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