gpt4 book ai didi

c# - await WebClient.DownloadStringTaskAsync 永远等待,但访问 Result 属性有效

转载 作者:行者123 更新时间:2023-11-30 19:38:12 27 4
gpt4 key购买 nike

以下代码段工作正常(在控制台上打印标记):

System.Net.WebClient wc = new System.Net.WebClient();
var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au");
Console.WriteLine(task1.Result); // works

但是当我等待任务时,它只是永远等待,任务的状态是 WaitingForActivation:

System.Net.WebClient wc = new System.Net.WebClient();
var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au");
Console.WriteLine(await task1);
Console.WriteLine("done!"); // this never gets printed

我错过了什么?

编辑:完整代码:

static void Main(string[] args)
{
DoIt();
}

static async void DoIt()
{
System.Net.WebClient wc = new System.Net.WebClient();
var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au");
Console.WriteLine(await task1);
Console.WriteLine("done!"); // this never gets printed
}

最佳答案

What am I missing?

目前,根据您调用代码的方式,我看不出任务是如何WaitingForActivation 的。一旦 DoIt 命中第一个 await,它就会将控制权交还给调用者,这是您的 Main 方法,它应该终止并关闭您的控制台。

使用 Task.Result 之所以有效,是因为它会同步阻塞异步方法,因此它会等待它完成,然后您会看到结果打印到控制台。

您实际需要做的是制作DoIt async Task 而不是async void,并使用Task.Wait 在那里同步阻塞所以 Main 不会终止:

static void Main(string[] args)
{
DoItAsync().Wait();
}

static async Task DoItAsync()
{
System.Net.WebClient wc = new System.Net.WebClient();
var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au");
Console.WriteLine(await task1);
Console.WriteLine("done!"); // this never gets printed
}

注意使用 Task.ResultTask.Wait 只是为了让控制台不终止。在任何其他环境(基于 UI 或 ASP.NET)中,您永远不应阻塞异步代码,而应始终await 异步方法。

关于c# - await WebClient.DownloadStringTaskAsync 永远等待,但访问 Result 属性有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34430868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com