我编写了以下内容(一个简单的控制台应用程序)来测试我对C#中异步和等待的理解。
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Async result: " + getLengthFromWebsiteAsync());
}
public static async Task<int> getLengthFromWebsiteAsync()
{
HttpClient httpClient = new HttpClient();
Task<string> sampleTask = httpClient.GetStringAsync("http://www.adobe.com");
Console.WriteLine("Before the await: ");
int lengthRequired = (await sampleTask).Length;
Console.WriteLine("After the await: " + lengthRequired.ToString());
return lengthRequired;
}
以下是我运行的结果:
Before the await:
Async result: System.Threading.Tasks.Task'1[System.Int32]
我的问题是,不是这条线&#34;在等待之后:&#34;应该出现?我是否在理解async / await流程的错误轨道上?
答案 0 :(得分:7)
目前你正在开始操作 - 但它永远不会完成。在对任务执行任何操作之前,您的程序正在终止。
由于这是一个控制台应用程序,continuation无论如何都将在线程池线程上运行,因此您可以更改代码以生成Main
方法块,直到任务完成:
public static void Main(string[] args)
{
Console.WriteLine("Async result: " + getLengthFromWebsiteAsync().Result);
}
通常,您应该非常小心地在任务中使用Result
和Wait()
,因为您很容易导致死锁。 (例如,在WinForms UI中执行上述操作是不安全的 - Result
调用将阻止UI线程,直到任务完成...并且任务将等待UI线程变为可用于在异步方法中await
之后运行延续。)