Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
在.net中使用异步流复制从何处获得好处_.net_File Io_Asynchronous_Streaming - Fatal编程技术网

在.net中使用异步流复制从何处获得好处

在.net中使用异步流复制从何处获得好处,.net,file-io,asynchronous,streaming,.net,File Io,Asynchronous,Streaming,我读书。 我注意到只有一个缓冲区用于读/写 使用异步调用进行流复制从何处获益 因为只有一个缓冲区,所以运行时的异步解决方案似乎是非常同步的。 写入必须等待读取,下一次读取必须等待缓冲区写入 一些想法: 我见过使用多个缓冲区的变体。 这只会让事情变得更复杂,占用更多内存,推迟问题的解决。 在某种程度上,它允许多个读操作与写操作并行进行 对于文件,我可以想象一个更轻松的写入解决方案:读取时写入一个块,并在读取所有文件时修复顺序。(文件系统必须支持此功能) 我读这篇文章是因为我使用的是.NET3.5,

我读书。 我注意到只有一个缓冲区用于读/写

使用异步调用进行流复制从何处获益

因为只有一个缓冲区,所以运行时的异步解决方案似乎是非常同步的。 写入必须等待读取,下一次读取必须等待缓冲区写入

一些想法:

我见过使用多个缓冲区的变体。 这只会让事情变得更复杂,占用更多内存,推迟问题的解决。 在某种程度上,它允许多个读操作与写操作并行进行

对于文件,我可以想象一个更轻松的写入解决方案:读取时写入一个块,并在读取所有文件时修复顺序。(文件系统必须支持此功能)

我读这篇文章是因为我使用的是.NET3.5,还不能使用.NET4或4.5

(微软网站上的netqa地址反弹)

写入必须等待读取

当然有。如果你还没有读数据,你会写什么

下一次读取必须等待缓冲区写入

在某些情况下,避免这种情况可能是有意义的,但您确实需要对此进行分析。各种缓存以及从硬盘读取和写入数据的方式可能会影响这一点。如果有一些性能上的好处,它可能不会很大

现在谈谈你的主要问题:

使用异步调用进行流复制从何处获益

收益来自这样一个事实:当IO发生时,您没有阻塞任何线程。这对性能很重要,因为线程是昂贵的资源(除其他外,每个线程都需要1 MB的虚拟和物理内存)。在ASP.NET这样的环境中,每个请求都由不同的线程处理,这会产生巨大的差异

如果您正在编写一个只复制几个文件的桌面应用程序,只要您不阻塞UI线程,这对您来说可能无关紧要

写入必须等待读取

当然有。如果你还没有读数据,你会写什么

下一次读取必须等待缓冲区写入

在某些情况下,避免这种情况可能是有意义的,但您确实需要对此进行分析。各种缓存以及从硬盘读取和写入数据的方式可能会影响这一点。如果有一些性能上的好处,它可能不会很大

现在谈谈你的主要问题:

使用异步调用进行流复制从何处获益

收益来自这样一个事实:当IO发生时,您没有阻塞任何线程。这对性能很重要,因为线程是昂贵的资源(除其他外,每个线程都需要1 MB的虚拟和物理内存)。在ASP.NET这样的环境中,每个请求都由不同的线程处理,这会产生巨大的差异


如果您正在编写一个只复制几个文件的桌面应用程序,只要您不阻塞UI线程,这可能对您来说并不重要。

异步处理有助于处理与CPU无关的延迟,并希望避免这些延迟而不跨越大量线程(这不能很好地扩展-每个CPU不应该有太多线程,因为线程是“昂贵”的资源,大量的上下文切换可能会降低性能)

因此,IO操作是典型的受益者,因为与处理数据所需的计算工作量相比,磁盘和网络都“慢”。因此,无论何时,当您可能有许多并行流(网络和磁盘)时,您都应该使用异步操作来处理它们

也就是说,正确的异步编程是很困难的,尤其是没有新的.NET编译器中的烘焙支持


一个好的异步复制应该至少使用两个缓冲区;一个同时读取数据(异步),一个同时写入数据(异步)。当然,空闲的写入程序只有在读卡器完成其块后才会启动,而空闲的读卡器只有在至少有一个备用缓冲区(例如,写入程序已完成写入)时才会启动。当您只有一个缓冲区时,连续读写操作之间会出现中断,例如,它将始终是“读、写、读……写”,而不是“读、读+写、读+写……写”.

异步处理有助于处理与CPU无关的延迟,并希望避免这些延迟而不跨越大量线程(扩展性不好-每个CPU不应该有太多线程,因为线程是“昂贵的”资源,大量的上下文切换可能会降低性能)

因此,IO操作是典型的受益者,因为与处理数据所需的计算工作量相比,磁盘和网络都“慢”。因此,无论何时,当您可能有许多并行流(网络和磁盘)时,您都应该使用异步操作来处理它们

也就是说,正确的异步编程是很困难的,尤其是没有新的.NET编译器中的烘焙支持

一个好的异步复制应该至少使用两个缓冲区;一个同时读取数据(异步),一个同时写入数据(异步)。当然,空闲的写入程序只有在读卡器完成其块后才会启动,而空闲的读卡器只有在至少有一个备用缓冲区(例如,写入程序已完成写入)时才会启动。当您只有一个缓冲区时,连续读写操作之间会出现中断,例如,它将始终是“读、写、读……写”,而不是“读、读+写、读+写……写”