Объясните пожалуйста, в чем разница использования 1 и 2 варианта и правильно ли они записаны?

ну по сути это немного совсем разные вещи)
delegate - указатель на метод, причем не обязательно на какой-то конкретный, если есть 2 или более метода, принимающих одинаковые параметры, то делегат может указывать на любой из них... вообще я не могу четко объяснить что это такое, так как это на уровне понимания...
ну а invoke применяется большей частью для "синхронизации" потоков в десктопных приложениях... проще говоря позволяет без лишних заморочек вносить изменение в один поток из другого.
реальный пример, где выполняется добавление записи в кастомный ListBox основного потока приложения из второстепенного:
private void AlcoFrameClient_MeasurementEvent(object sender, MeasurementResult measurementResult)
{
LogTable.Invoke(new Action(() =>
{
MssqlDB.AddMeasurement(measurementResult);
if (StartLog.IsChecked && MeasurementFilter.Filtered(measurementResult).Length > 0)
LogTable.Items.Add(measurementResult);
}));
}
где в LogTable мы добавляем запись из другого потока (который по mqtt протоколу получает данные и при получении вызывает событие на которое подписан этот метод) без каких либо заморочек! если упросить код и отбросить проверку с вызовом метода записи в бд, то будет так:
private void AlcoFrameClient_MeasurementEvent(object sender, MeasurementResult measurementResult)
{
LogTable.Invoke(new Action(() =>
{
LogTable.Items.Add(measurementResult);
}));
}
ну у инвокера квес векс и экзорт, а у делигата меньше скилов.
Invoke - это метод элементов управления, для выполнения кода в потоке элемента. Если пишешь что-то мультипоточное, и надо из другого треда поменять что-то в UI, то надо пихать код в Invoke, т. к. всё UI живёт в главном потоке, и не любит, когда что-то с ним делают из другого треда.
Action - если упрощённо, то это способ запихнуть какой-то код в переменную. Таким образом его можно будет передать аргументом в функцию, например, и там его выполнить. Удобно, если пишешь что-то модульное, где одна функция, должна будет выполнять разный код, который заранее не до конца известен (т. е. будет расширятся по мере разрастания проекта).