Dlaczego asynchroniczna metoda delegowania wymaga wywołania EndInvoke?

Dlaczego delegat musi zadzwonić do EndInvoke przed odpaleniem metody? Jeśli muszę wywołać EndInvoke (który blokuje wątek), to tak naprawdę nie jest to wywołanie asynchroniczne?

Oto kod, który próbuję uruchomić.

class Program
    {
        private delegate void GenerateXmlDelegate();

        static void Main(string[] args)
        {
            GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml);
            IAsyncResult result = worker.BeginInvoke(null, null);
        }

        private static void GenerateMainXml()
        {
            Thread.Sleep(10000);
            Console.WriteLine("GenerateMainXml Called by delegate");
        }
    }

questionAnswers(2)

yourAnswerToTheQuestion