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