public class test
{
public async Task Go()
{
await PrintAnswerToLife();
Console.WriteLine("done");
}
public async Task PrintAnswerToLife()
{
int answer = await GetAnswerToLife();
Console.WriteLine(answer);
}
public async Task<int> GetAnswerToLife()
{
await Task.Delay(5000);
int answer = 21 * 2;
return answer;
}
}
jeśli chcę zadzwonić pójść w metodzie main(), jak mogę to zrobić? Próbuję C# nowe funkcje, wiem, że mogę podłączyć metodę asynchroniczną do zdarzenia i przez wywołanie tego zdarzenia, można wywołać metodę async.Jak mogę wywołać metodę async Go na przykład Main()?
Ale co, jeśli chcę wywołać ją bezpośrednio w metodzie głównej? Jak mogę to zrobić?
zrobiłem coś
class Program
{
static void Main(string[] args)
{
test t = new test();
t.Go().GetAwaiter().OnCompleted(() =>
{
Console.WriteLine("finished");
});
Console.ReadKey();
}
}
Ale wydaje się, że to martwy blokady i nic nie jest drukowane na ekranie.
wydaje mi się znaleźć problem, bo GetAwaiter() OnCompleted() powróci do natychmiastowa główna funkcja, więc gdy wywoływana jest funkcja Console.Readkey(), główny wątek blokuje, dlatego komunikat wyjściowy zwrócony z zadania nie może zostać wydrukowany na ekranie, ponieważ oczekuje na odblokowanie głównego wątku. Jeśli zamieniam Console.readkey() na while (true) { Thread.Sleep (1000); } działa poprawnie. – Larry
Nie mogę odtworzyć problemu z zakleszczeniem, ale jeśli ktoś ma na to ochotę, użyj 'Go(). ConfigureAwait (false) .GetAwaiter()', aby użyć nowego kontekstu w metodzie asynchronicznej. – arviman