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

标签 c# .net task-parallel-library async-await

我正在努力了解 async/await 并编写了以下控制台应用程序来下载给定 URL 的页面内容(基于来自 dotnetperls 的 httpclient example)

没有任何内容写入文件。我在这里做错了什么?

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;
}

最佳答案

因为应用被终止了。您需要等到 AsyncExample 完成,然后才能让 main 完成它的代码。

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

要解决这个问题,您需要等到 AsyncExample 完成。

一种方法是使用延续,然后使用 Task.Wait() 方法等待此延续任务。

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

但是,如果我们不使用延续,并且我们没有从错误的任务中读取异常值或结果,那么在完成任务时,应用程序可能会终止。 continuation 的技巧可以处理这两种情况。

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();
}

关于c# - 为什么这个异步方法在写入文件之前退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478714/

相关文章:

c# - 当 .Net Thread 没有名称时,如何使用 NLog 打印 threadid 而不是 threadname?

c# - 仅运行当前任务和最近排队的任务

c# - 设计模式 C# 存储库

c# - 性能 : which is faster calling reverse on a stack or popping items into an array

c# - 根据什么确定客户所在的国家/地区? IP地址?

c# - Windows Phone 8.1 中的 Microsoft.Phone.UserData 在哪里?

.net - 记录 SOAP 请求和响应

.net - Log4Net 跨多个线程记录单个 session 的 IP 地址

.Net 4 Task的调度澄清?

C# 和任务 - UI 线程挂起 - 预异步/等待关键字