static void Main(string[] args) { MyClass myClass = new MyClass(); // Pass a regular method as a callback myClass.LongRunningMethod1(printProgress); Console.WriteLine("/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*"); // Pass a Lambda expression as a callboack myClass.LongRunningMethod1(progress => { if (progress % 100 == 0) // Print only multiples of 100 { Console.WriteLine(progress); } }); Console.WriteLine("/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*"); Console.WriteLine("/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*"); // Using System Action myClass.LongRunningMethod2(printProgress); Console.WriteLine("/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*"); // Lambda expressions are equivalent to a delegate, so this works exactly the same as before. myClass.LongRunningMethod2((progress) => { if (progress % 100 == 0) // Print only multiples of 100 { Console.WriteLine(progress); } }); Console.ReadLine(); }