为什么这个异步方法在写入文件之前退出?

Ani*_*esh 4 .net c# task-parallel-library async-await

我试图了解async/await并编写以下控制台应用程序以下载给定URL的页面内容(基于来自dotnetperls 的httpclient示例)

什么都没有写入文件.我在这做错了什么?

static void Main()
{
    AsyncExample();
}

static async void AsyncExample()
{
    Task<string> task = DownloadPageAsync();
    string result = await task;
    WriteToFile(result, someFileName);
}

static async Task<string> DownloadPageAsync()
{
    string page = "http://en.wikipedia.org/wiki/Asynchronous_I/O";
    string result = string.Empty;

    using(HttpClient client = new HttpClient())
    using(HttpResponseMessage response = await client.GetAsync(page))
    using(HttpContent content = response.Content)
    {
        result = await content.ReadAsStringAsync();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

m1o*_*1o2 9

这是因为申请被终止了.您需要等到AsyncExample完成后才让主要完成它的代码.

目前,Main方法在任务执行之前完成,因此无论任务状态如何,应用程序都会立即终止.

要解决此问题,您需要等到AsyncExample完成.

一种方法是 使用延续然后到 等等 延续 使用Task.Wait()方法的任务.

我们使用延续来处理错误.从原始任务中读取Result属性将在出错时抛出异常(如果您希望在此处抛出异常,请执行此操作).

但是,如果我们没有使用延续,并且我们没有从故障任务中读取Exception值或Result,那么在完成Task时,应用程序可以终止.继续处理这两种情况的技巧.

static async Task AsyncExample()
{
    Task<string> task = DownloadPageAsync();
    string result = await task;
    WriteToFile(result, someFileName);
}

public static void Main(string[] args)
{
    var task = AsyncExample();

    task.Wait();
    // task.ContinueWith( t => { }).Wait();
}
Run Code Online (Sandbox Code Playgroud)

  • 除非我遗漏了一些东西,否则在这里搞乱延续是不必要的.任务的想法是使用async/await或ContinueWith组合它们,因此它们保持非阻塞状态; 当你想获得最终结果时,你可以调用Wait.这就是你将获得任务产生的任何异常的地方,如果有的话.建议在这里添加一个继续来抑制错误就像建议用try-all处理程序在try块中包装方法调用.很少,你想要压制所有异常...但是,通常你想知道它们. (3认同)