C# DownloadStringTaskAsync和DownloadStringAsync如何不阻塞UI线程?

C# DownloadStringTaskAsync和DownloadStringAsync如何不阻塞UI线程?,c#,asynchronous,C#,Asynchronous,据我所知,它们都没有“async”关键字。下载时它们是否都创建了新线程?我听人说他们不使用新的线程。那它是怎么做到的呢 正常的DownloadString方法确实会阻塞UI线程,但是其他两个方法如何做到这一点,而不使用“await”关键字从方法返回并等待操作完成 据我所知,它们都没有“async”关键字。下载时它们是否都创建了新线程 对。但是您不必为了异步而使用async 它们不会创建新线程,如果您的意思是它们只是将阻塞工作排队到线程池中。当操作完成时,他们确实“使用线程资源”,尽管我要说的是文

据我所知,它们都没有“async”关键字。下载时它们是否都创建了新线程?我听人说他们不使用新的线程。那它是怎么做到的呢

正常的DownloadString方法确实会阻塞UI线程,但是其他两个方法如何做到这一点,而不使用“await”关键字从方法返回并等待操作完成

据我所知,它们都没有“async”关键字。下载时它们是否都创建了新线程

对。但是您不必为了异步而使用
async

它们不会创建新线程,如果您的意思是它们只是将阻塞工作排队到线程池中。当操作完成时,他们确实“使用线程资源”,尽管我要说的是文档是误导性的

我听人说他们不使用新的线程。那它是怎么做到的呢

看。总之,真正的异步I/O使用回调,回调通常在完成端口结束,在.NET中,完成端口是线程池的一部分。但是,不存在执行I/O时被阻止的线程;相反,线程池的I/O线程(不是工作线程)用于在完成端口工作时为其提供服务

据我所知,它们都没有“async”关键字。下载时它们是否都创建了新线程

对。但是您不必为了异步而使用
async

它们不会创建新线程,如果您的意思是它们只是将阻塞工作排队到线程池中。当操作完成时,他们确实“使用线程资源”,尽管我要说的是文档是误导性的

我听人说他们不使用新的线程。那它是怎么做到的呢



看。总之,真正的异步I/O使用回调,回调通常在完成端口结束,在.NET中,完成端口是线程池的一部分。但是,不存在执行I/O时被阻止的线程;相反,线程池的I/O线程(不是工作线程)用于在完成端口工作时为其提供服务。

来自官方:“使用线程池自动分配的线程资源异步下载资源。”哦,哇。我没看到。我之所以担心这个问题,是因为TcpClient的ConnectAsync也有同样的问题。官方文档没有关于它是否使用线程池中的线程的信息。强烈建议使用HttpClient,它的接口和方法实际上是有意义的:)DownloadStringTaskAsync用于
Wait
。你用它的时候不用吗?你能告诉我们你是如何使用它的吗?我确实使用了wait,因为它显然使用了一个新的线程来下载。但是,官方文档还指出,您不应该在I/O绑定相关工作中使用新线程。下载东西是一个I/O操作,但是DownloadStringTaskAsync确实使用了一个新线程来完成任务。这是为什么呢?来自官方:“资源是使用线程池中自动分配的线程资源异步下载的。”哦,哇。我没看到。我之所以担心这个问题,是因为TcpClient的ConnectAsync也有同样的问题。官方文档没有关于它是否使用线程池中的线程的信息。强烈建议使用HttpClient,它的接口和方法实际上是有意义的:)DownloadStringTaskAsync用于
Wait
。你用它的时候不用吗?你能告诉我们你是如何使用它的吗?我确实使用了wait,因为它显然使用了一个新的线程来下载。但是,官方文档还指出,您不应该在I/O绑定相关工作中使用新线程。下载东西是一个I/O操作,但是DownloadStringTaskAsync确实使用了一个新线程来完成任务。这是为什么呢?博客里有很多我似乎不太明白的术语。据我所知,I/O线程不是由用户使用的,而是由框架来完成任务(在我们的例子中,我假设它使用I/O线程来下载),这就是工作线程和I/O线程之间的区别。是的,I/O线程用于完成任务。但是他们不习惯下载。下载完成后,它们将用于完成下载任务。下载任务会占用并阻塞UI线程。我很难理解.NET是如何做到不阻塞的。我敢肯定,这个博客似乎解释得很清楚,但我只是不知道有很多术语。@Enlight:你可以把它看作是回调。
Download*Async
方法将请求下载并注册回调。然后返回一个任务。下载完成后,回调函数将完成任务。您是否可以展示您刚才所做示例的可视化效果?据我所知,如果它要求下载,谁下载?如果同一个线程下载它,它不会阻止吗?这个博客有很多术语,我似乎不太清楚。据我所知,I/O线程不是由用户使用的,而是由框架来完成任务(在我们的例子中,我假设它使用I/O线程来下载),这就是工作线程和I/O线程之间的区别。是的,I/O线程用于完成任务。但是他们不习惯下载。下载完成后,它们将用于完成下载任务。下载任务会占用并阻塞UI线程。我很难理解.NET是如何做到不阻塞的。我敢肯定,这个博客似乎解释得很清楚,但我只是不知道有很多术语。@Enlight:你可以把它看作是回调。
Download*Async
方法将请求下载并注册回调。然后返回一个