异步/等待流

时间:2014-06-16 18:14:07

标签: c# asynchronous

我编写了以下内容(一个简单的控制台应用程序)来测试我对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流程的错误轨道上?

1 个答案:

答案 0 :(得分:7)

目前你正在开始操作 - 但它永远不会完成。在对任务执行任何操作之前,您的程序正在终止。

由于这是一个控制台应用程序,continuation无论如何都将在线程池线程上运行,因此您可以更改代码以生成Main方法块,直到任务完成:

public static void Main(string[] args)
{
    Console.WriteLine("Async result: " + getLengthFromWebsiteAsync().Result);
}

通常,您应该非常小心地在任务中使用ResultWait(),因为您很容易导致死锁。 (例如,在WinForms UI中执行上述操作是不安全的 - Result调用将阻止UI线程,直到任务完成...并且任务将等待UI线程变为可用于在异步方法中await之后运行延续。)