Fire-and-forget z asynchronicznym vs „starym asynchronicznym delegatem”

Staram się zastąpić moje stare połączenia typu „zapnij i zapomnij” nową składnią, mając nadzieję na większą prostotę i wydaje mi się, że mi się nie udaje. Oto przykład

class Program
{
    static void DoIt(string entry) 
    { 
        Console.WriteLine("Message: " + entry);
    }

    static async void DoIt2(string entry)
    {
        await Task.Yield();
        Console.WriteLine("Message2: " + entry);
    }

    static void Main(string[] args)
    {
        // old way
        Action<string> async = DoIt;
        async.BeginInvoke("Test", ar => { async.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null);
        Console.WriteLine("old-way main thread invoker finished");
        // new way
        DoIt2("Test2");   
        Console.WriteLine("new-way main thread invoker finished");
        Console.ReadLine();
    }
}

Oba podejścia robią to samo, jednak to, co wydaje mi się zyskać (nie trzebaEndInvoke i zamknij klamkę, która jest wciąż trochę dyskusyjna). Tracę w nowy sposób, czekając naTask.Yield(), co w rzeczywistości stwarza nowy problem polegający na konieczności przepisywania wszystkich istniejących metod asynchronicznych F&F, aby dodać tylko jeden liner. Czy są jakieś niewidzialne korzyści w zakresie wydajności / oczyszczania?

Jak przejść do stosowania asynchronizacji, jeśli nie mogę zmodyfikować metody tła? Wydaje mi się, że nie ma bezpośredniego sposobu, musiałbym utworzyć metodę asynchroniczną wrappera, która oczekiwałaby Task.Run ()?

Edytuj: Teraz widzę, że może mi brakować prawdziwych pytań. Pytanie brzmi: Biorąc pod uwagę metodę synchroniczną A (), jak mogę ją wywołać asynchronicznieasync/await w sposób ognisty i zapomnij, nie uzyskując rozwiązania, które jest bardziej skomplikowane niż „stary sposób”

questionAnswers(4)

yourAnswerToTheQuestion