Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 异步:为什么异步下载字符串?_Asynchronous_F# - Fatal编程技术网

Asynchronous 异步:为什么异步下载字符串?

Asynchronous 异步:为什么异步下载字符串?,asynchronous,f#,Asynchronous,F#,好吧。。。我有点糊涂了。异步monad允许您使用let!它将启动给定异步方法的计算,并挂起线程,直到结果可用。。没关系,我明白 现在我不明白的是,为什么他们为WebClient类做了一个扩展,名为AsyncDownloadString——难道你不能将普通的DownloadString封装在一个异步块中吗?我很确定,我忽略了一点,因为我做了一些测试,显示DownloadString封装在异步块中,仍然会阻塞线程。两者之间有一个重要的区别: DownloadString方法是同步的-调用该方法的线程

好吧。。。我有点糊涂了。异步monad允许您使用let!它将启动给定异步方法的计算,并挂起线程,直到结果可用。。没关系,我明白


现在我不明白的是,为什么他们为WebClient类做了一个扩展,名为AsyncDownloadString——难道你不能将普通的DownloadString封装在一个异步块中吗?我很确定,我忽略了一点,因为我做了一些测试,显示DownloadString封装在异步块中,仍然会阻塞线程。

两者之间有一个重要的区别:

DownloadString方法是同步的-调用该方法的线程将被阻止,直到整个字符串被下载,即直到整个内容通过internet传输

另一方面,AsyncDownloadString不会长时间阻塞线程。它要求操作系统启动下载,然后释放线程。当操作系统接收到一些数据时,它从线程池中选取一个线程,该线程将数据存储到某个缓冲区,然后再次释放。下载所有数据后,该方法将从缓冲区读取所有数据,并恢复异步工作流的其余部分

在第一种情况下,线程在整个下载过程中被阻塞。在第二种情况下,当处理收到的响应时,线程只在很短的时间内忙碌,而在等待服务器时却不忙碌


在内部,AsyncDownloadString方法只是DownloadStringAsync的包装,因此您还可以在中找到更多信息。

这两者之间有一个重要区别:

DownloadString方法是同步的-调用该方法的线程将被阻止,直到整个字符串被下载,即直到整个内容通过internet传输

另一方面,AsyncDownloadString不会长时间阻塞线程。它要求操作系统启动下载,然后释放线程。当操作系统接收到一些数据时,它从线程池中选取一个线程,该线程将数据存储到某个缓冲区,然后再次释放。下载所有数据后,该方法将从缓冲区读取所有数据,并恢复异步工作流的其余部分

在第一种情况下,线程在整个下载过程中被阻塞。在第二种情况下,当处理收到的响应时,线程只在很短的时间内忙碌,而在等待服务器时却不忙碌


在内部,AsyncDownloadString方法只是DownloadStringAsync的包装器,因此您还可以在中找到更多信息。

需要注意的重要一点是,异步编程是关于执行不受CPU限制的操作,即受IO限制的操作。这些IO绑定操作是使用操作系统的重叠IO特性在IO线程上执行的。这意味着,即使您在一个异步块中封装一些阶乘函数,并使用let在另一个异步块中运行它!绑定,您不会从中得到任何好处,因为它将在CPU绑定线程上运行,而异步编程的主要目的是在IO性质的事情发生时不占用CPU绑定线程,因为在IO完成的同时,CPU绑定线程可以用于其他目的

如果您查看.NET中的各种IO类,如文件、套接字等,它们都有阻塞和非阻塞读写操作。阻塞操作将等待IO在CPU线程上完成,从而阻塞CPU线程,直到IO完成,其中非阻塞操作使用重叠的IO API调用来执行操作


Async有一种方法可以用这些文件的非阻塞API生成异步块,Socket等。在您的情况下,调用DownloadString将阻塞CPU线程,因为它使用底层类的阻塞API,而AsyncDownloadString使用基于非阻塞io重叠的API调用。

需要注意的重要一点是,异步编程是关于执行不受CPU限制的操作,即io限制的操作跳跃这些IO绑定操作是使用操作系统的重叠IO特性在IO线程上执行的。这意味着,即使您在一个异步块中封装一些阶乘函数,并使用let在另一个异步块中运行它!绑定,您不会从中得到任何好处,因为它将在CPU绑定线程上运行,而异步编程的主要目的是在IO性质的事情发生时不占用CPU绑定线程,因为在IO完成的同时,CPU绑定线程可以用于其他目的

如果您查看.NET中的各种IO类,如文件、套接字等,它们都有阻塞和非阻塞读写操作。阻塞操作将等待IO在t上完成 CPU线程,从而阻塞CPU线程,直到IO完成,其中非阻塞操作使用重叠的IO API调用来执行操作


Async有一种方法可以从这些文件、套接字等的非阻塞API中生成异步块。在您的情况下,调用DownloadString将阻塞CPU线程,因为它使用底层类的阻塞API,而AsyncDownloadString使用非阻塞io重叠的API调用。

有意义,即使将DownloadString包装在异步块中,它仍将保持同步,因为它不能被计算,不能使用let!或者回来!在非异步块上,即使将DownloadString包装在异步块中,它仍然会保持同步,因为它不能被计算,不能使用let!或者回来!在非异步