Wezwę metodę asynchroniczną w mojej aplikacji konsoli. Nie chcę, aby aplikacja została zamknięta krótko po jej uruchomieniu, tj. Zanim zakończą się ważne zadania. Wydaje się, że mogę to zrobić:Dlaczego potrzebny jest AsyncContext podczas używania async/await z aplikacją konsolową?
internal static void Main(string[] args)
{
try
{
Task.WaitAll(DoThisAsync());
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
throw;
}
}
internal static async Task DoThisAsync()
{
//...
}
Ale według Stephen Cleary's article wydaje się, że nie mogę tego zrobić i należy zamiast tworzyć jakiś kontekst dla asynchronicznych, aby powrócić do kiedy to zrobić (np AsyncContext).
Powyższy kod działa i zwraca się po głównym wątku po Task.WaitAll(DoThisAsync());
, dlaczego więc muszę użyć niestandardowego kontekstu?
Być może dzieje się tak, gdy używasz threadpool. Wątki Threadpool są wątkami tła, a główny wątek jest tylko pierwszym planem. Aplikacje interfejsu użytkownika będą miały pętlę główną, która nie pozwoli im wyjść, zanim coś się stanie, a aplikacje konsolowe zwykle nie mają tej pętli. Jeśli więc nie zablokujesz głównego wątku czekającego na coś, twoja aplikacja zostanie po prostu zakończona, a praca, którą wykonywałeś w wątku, zniknie. Nie jestem jednak pewien. – Spo1ler
Jak wspomniano w @StephenCleary, jest to tylko preferencja. Nie ma znaczenia, w jaki sposób blokujesz wątek, po prostu musisz mieć świadomość, że jeśli nie będziesz w jakiś sposób zarządzać tym wątkiem, twoja aplikacja zostanie zamknięta (nawet jeśli twoje inne wątki nie zostaną wykonane) – Brandon
@Bandon Cóż, to * ma znaczenie *. Działają inaczej, ale oczywiście można pisać programy robocze przy użyciu obu metod. – Servy