Запустить и забыть с помощью async против «старого асинхронного делегата»

Я пытаюсь заменить мои старые вызовы «забей и забудь» новым синтаксисом, надеясь на большую простоту, и это, похоже, ускользает от меня. Вот пример

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();
    }
}

Оба подхода делают то же самое, однако то, что я, кажется, получил (нет необходимостиEndInvoke и закрыть ручку, которая имхо еще немного спорно) я теряю по-новому, имея для ожиданияTask.Yield(), что фактически ставит новую проблему необходимости переписывать все существующие асинхронные F & amp; F методы просто для добавления этой однострочной. Есть ли какие-то невидимые улучшения с точки зрения производительности / очистки?

Как мне применить асинхронный режим, если я не могу изменить фоновый метод? Сдается мне, что прямого пути нет, мне нужно было бы создать асинхронный метод-обертку, который бы ожидал Task.Run ()?

Изменить: теперь я вижу, что я мог бы пропустить реальные вопросы. Вопрос заключается в следующем: учитывая синхронный метод A (), как я могу вызвать его асинхронно, используяasync/await в духе «забей и забудь», не получив решения, более сложного, чем «старый способ»;

Ответы на вопрос(4)

Ваш ответ на вопрос