¿Debería uno siempre llamar a EndInvoke un delegado dentro de AsyncCallback?

yo leo elUse AsyncCallback, hay un fragmento de código:

using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;
class MainClass
{
  delegate int MyDelegate(string s);

  static void Main(string[] args)
  {
    MyDelegate X = new MyDelegate(DoSomething);
    AsyncCallback cb = new AsyncCallback(DoSomething2);
    IAsyncResult ar = X.BeginInvoke("Hello", cb, null);

    Console.WriteLine("Press any key to continue");
    Console.ReadLine();
  }
  static int DoSomething(string s)
  {
    Console.WriteLine("doooooooooooooooo");
    return 0;
  }

  static void DoSomething2(IAsyncResult ar)
  {
    MyDelegate X = (MyDelegate)((AsyncResult)ar).AsyncDelegate;
    X.EndInvoke(ar);
  }
}

Tenga en cuenta que enDoSomething2, que es unAsyncCallback, el delegado es asesinado explícitamente por el comandoEndInvoke.

¿Es esto realmente necesario? PorqueAsyncCallback no se llamará a menos que y hasta que el método de delegado termine de ejecutarse.