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;
}
}
如果我想在main()方法中調用Go,我該怎麼做? 我正在嘗試c#新功能,我知道我可以將異步方法掛接到事件,並通過觸發該事件,可以調用異步方法。如何在例如Main()中調用異步Go方法?
但是如果我想直接用main方法調用它呢?我怎樣才能做到這一點?
我不喜歡的東西
class Program
{
static void Main(string[] args)
{
test t = new test();
t.Go().GetAwaiter().OnCompleted(() =>
{
Console.WriteLine("finished");
});
Console.ReadKey();
}
}
,但似乎這是一個死鎖和沒有打印在屏幕上。
似乎我發現這個問題,COS GetAwaiter()OnCompleted()將返回主函數立即,所以當調用Console.Readkey()時,主線程被阻塞,因此從任務返回的輸出消息不能被打印到屏幕上,因爲它正在等待主線程解除阻塞。如果我用while替換Console.readkey()while(true) Thread.Sleep(1000); }它工作正常。 – Larry
我無法重現您的死鎖問題,但是,如果有人在意..使用'Go()。ConfigureAwait(false).GetAwaiter()'在異步方法中使用新的上下文。 – arviman