c# - 关于流的一些事

标签 c# .net stream

我一直在研究一些利用流的东西,但我发现自己不清楚一些流概念(您也可以查看我在 About redirected stdout in System.Diagnostics.Process 发布的另一个问题)。

1.你如何表明你已经完成了一个流的写入,写入了诸如EOF之类的东西?

2.按照上一个问题,如果我已经向流写入了 EOF(或类似的内容)但没有关闭流,那么我想向同一个流写入其他内容,我可以开始写入吗不需要更多设置?

3.如果一个过程尝试读取一个没有人写入任何内容的流(例如 stdin ),则读取过程将被阻塞,最后一些数据到达,该过程将只读取直到写入完成,这是通过返回 0 字节读取计数而不是被阻止来指示的,现在如果该过程向同一流发出另一个读取,它仍然会得到 0 计数并立即返回,而我预计它会被阻止,因为现在没有人正在向流写入数据。那么,当流被打开但尚未有人写入时以及当有人完成写入 session 时,流是否会保持不同的状态?

如果有任何特定于平台的东西,我正在使用 Windows .net 框架。

非常感谢!

最佳答案

这取决于具体的流。例如,读取MemoryStream不会像你所描述的那样阻塞。这是因为 MemoryStream 具有明确的大小,当您从流中读取时,指针会在流中前进,直到到达末尾,此时 Read 将返回 0。如果 MemoryStream 中没有数据,则第一个 Read 会返回 0。会立即返回 0。

您所描述的内容符合 NetworkStream ,在这种情况下,当“服务器”端关闭底层 Socket 时,从流中读取数据将被阻塞,直到数据可用为止。由 NetworkStream 包装的读取将返回 0。

因此实际细节取决于流,但在高层,它们都被视为相同的,即。您可以从流中读取数据,直到 Read 返回 0。

关于c# - 关于流的一些事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933995/

相关文章:

node.js - 强制 Node.js 刷新对子进程的写入

c++ - 具有奇怪行为的结构 vector C++

c# - 使用自定义 logentry 类和自定义 logformatter

c# - 多个线程调用同一函数不起作用

.net - 向 Internet Explorer 9 添加按钮

.net - 用于实时消息传递的 BizTalk

c# - 前向消除实现的问题

c# - 你应该压缩 html 页面吗?如果是这样,如何在 .net 中做到这一点?

c# - .Net 并行、任务 API 与常规线程

Java通信客户端/服务器