【发布时间】:2015-02-12 18:20:30
【问题描述】:
我试图了解 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;
}
【问题讨论】:
-
当您使用调试器时,
result是否有值?如果确实如此,则意味着您的WriteToFile方法没有做它应该做的事情。你有什么例外吗? -
没有例外。主线程在代码可以完成工作之前完成,如 m1o2 的回答。
-
您确认了吗?因为当我执行您的代码并打印
result时,它会给我正确的行为。 -
正如你提到的,我能够打印结果,但前提是我在主线程上使用
Task.Wait()。 -
async/await 的全部意义在于让您编写看起来同步但实际上是非阻塞的代码。因此,您在 Main 中对 AsyncExample 的调用几乎立即返回(在第一次等待时),并将继续在后台线程上执行其业务(广义而言)。然后,Main 函数本身返回,无需等待结果。
标签: c# .net task-parallel-library async-await