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”