gpt4 book ai didi

c# - 异步/等待流程

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:02 25 4
gpt4 key购买 nike

我编写了以下内容(一个普通的控制台应用程序)来测试我对 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]

我的问题是,“After the await:”这一行是不是应该出现?我对 async/await 流程的理解有误吗?

最佳答案

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

因为这是一个控制台应用程序,continuations 无论如何都会在线程池线程上运行,因此您可以更改代码以使 Main 方法阻塞,直到任务完成:

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

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

关于c# - 异步/等待流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249710/

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