Запустить и забыть с помощью 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
в духе «забей и забудь», не получив решения, более сложного, чем «старый способ»;