gpt4 book ai didi

c# - 何时使用 StreamReader.ReadBlock()?

转载 作者:可可西里 更新时间:2023-11-01 08:42:44 24 4
gpt4 key购买 nike

我想知道 Read(char[],int,int) 无法返回所有请求的字符而 ReadBlock() 按预期返回所有字符的情况(比如当 StreamReader 使用 FileStream 对象的实例时)。

最佳答案

在实践中,当使用 StreamReader它只可能发生在可能延迟一段时间的流中 - 例如人们在这里提到的网络流。

但是,对于 TextReader通常,您可以期望它随时发生(包括可能在当前未发生的情况下使用 future 版本的 .NET - 它不会发生 StreamReader 支持 FileStream 不是记录在案,所以不能保证它不会在未来发生)。

特别是在很多情况下,如果实现者只需清空即可部分完成调用,那么实现者不返回请求的金额会更容易(具有更简单、更可靠且可能更高效的代码的链式 react )当前缓冲区,或者在执行只能返回较少字符数的操作之前,使用请求的数量作为传递给支持源(流或另一个 TextReader )的数量。

现在,回答“何时使用 StreamReader.ReadBlock()?”这个实际问题。 (或更一般地说,何时使用 TextReader.ReadBlock())。应牢记以下几点:

  1. 两者都是 Read()ReadBlock()保证至少返回一个字符,除非已阅读整个源代码。如果有未决内容,两者都不会返回 0。

  2. 调用 ReadBlock()什么时候Read() will do 是浪费,因为它会不必要地循环。

  3. 但另一方面,这并不是浪费。

  4. 但在第三方面,Read() 的情况将返回少于请求的字符的情况通常是另一个线程正在获取将为下一次调用填充缓冲区的内容,或者该内容尚不存在(例如,用户输入或另一台机器上的挂起操作) -在处理部分结果然后调用 Read() 时可以找到更好的整体并发性完成后再次。

所以。如果您可以对部分结果做一些有用的事情,请调用 Read()并努力得到你所得到的。特别是如果您正在循环处理每个 Read() 的结果然后执行此操作而不是使用 ReadBlock() .

一个值得注意的案例是,如果您正在构建自己的 TextReader,该 TextReader 由另一个支持。没必要调用ReadBlock()除非该算法确实需要一定数量的字符才能工作 - 只需从对 Read() 的调用中返回尽可能多的字符即可让调用代码调用ReadBlock()如果需要的话。

特别注意以下代码:

char buffer = char[4096];
int len = 0;
while((len = tr.ReadBlock(buffer, 0 , 4096)) != 0)
DoSomething(buffer, 0, len);

可以重写为:

char buffer = char[4096];
for(int len = tr.Read(buffer, 0, 4096); len != 0; len = tr.Read(buffer, 0, 4096))
DoSomething(buffer, 0, len);

它可能调用DoSomething()有时尺寸较小,但如果有另一个线程参与为下一次调用 Read() 提供数据,它也可以具有更好的并发性.

然而,在大多数情况下, yield 并不大。如果您确实需要一定数量的字符,请调用 ReadBlock() .最重要的是在那些情况下 Read()将具有与 ReadBlock() 相同的结果ReadBlock() 的开销检查它是否已这样做非常轻微。不要试图猜测是否 Read()在特定情况下是否安全;如果需要ReadBlock()的保证然后使用 ReadBlock() .

关于c# - 何时使用 StreamReader.ReadBlock()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810455/

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