Я пытаюсь заменить свои старые вызовы с использованием огня и забывания новым синтаксисом, надеясь на более простоту и, похоже, ускользает от меня. Вот пример
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
и закрывать дескриптор, что является imho все еще немного спорным). Я теряю по-новому, ожидая Task.Yield()
, что фактически создает новую проблему переписывания всех существующих методов асинхронного F & F только для добавления этого однострочного. Есть ли невидимая прибыль с точки зрения производительности/очистки?
Как я могу применить async, если не могу изменить метод фона? Мне кажется, что нет прямого пути, мне нужно будет создать метод асинхронной обертки, который будет ждать Task.Run()?
Изменить: теперь я вижу, что у меня могут возникнуть вопросы. Возникает вопрос: учитывая синхронный метод A(), как я могу называть его асинхронно с помощью async
/await
в режиме "огонь-и-забыть", не получая решения, которые сложнее, чем "старый способ"