Yes that is the correct approach on how delegates would work. A delegate is simply a function object and allows you to pass functions around as data.
As an aside you should rarely need to declare the delegate type(s) yourself and instead rely on the pre-defined ones. This reduces your code and speeds things up. .NET already provides delegates for any method that accepts up to 16 parameters (at last check) and optionally return a value.
Action<...> - void returning functions
Func<...,T> - T returning functions
static void DataProgression(int param1, Action<string> callback)
{
for (int i = 0; i < 100; i++)
{
callback(param1.ToString());
param1++;
}
}
//Long form
Action<string> foo = DelegateMethod;
DataProgression(1, foo);
//Short form
DataProgression(1, DelegateMethod);
//Short, short form
DataProgression(1, x => Console.WriteLine(x));