好吧......我在这里有点困惑.该async单子允许您使用let!该命令将启动给定异步方法的计算,并挂起线程,直到其结果是可利用的.这就是全部罚款,我明白这一点.
现在我不明白为什么他们为这个WebClient类做了一个扩展,那个名字命名AsyncDownloadString- 你不能只将普通内容包裹在DownloadString异步块中吗?我很确定,我在这里错过了一个重要的观点,因为我已经完成了一些测试,显示DownloadString包含在异步块中,仍然阻塞了线程.
两者之间有一个重要的区别:
该DownloadString方法是同步的 - 调用该方法的线程将被阻塞,直到整个字符串被下载(即直到整个内容通过互联网传输).
另一方面,AsyncDownloadString长时间不阻塞线程.它要求操作系统启动下载,然后释放该线程.当操作系统接收到某些数据时,它从线程池中选择一个线程,该线程将数据存储到某个缓冲区并再次释放.下载所有数据后,该方法将从缓冲区读取所有数据并恢复其余的异步工作流程.
在第一种情况下,线程在整个下载期间被阻止.在第二种情况下,线程仅在非常短的时间内忙(处理收到的响应时,但在等待服务器时不会).
在内部,该AsyncDownloadString方法只是一个包装器DownloadStringAsync,因此您还可以在MSDN文档中找到更多信息.