C#,有“线程安全”流这样的东西吗?

时间:2011-07-25 16:48:18

标签: c# multithreading stream thread-safety

我正在将进程的输出重定向到流读取器,我稍后会阅读。我的问题是我正在使用多个线程,它应该有这个流的单独实例。当我去读这个流时,线程捏造并开始奇怪地执行。

是否存在制作线程安全流的问题?
编辑:我在streamreader上的ReadToEnd上设置了锁,以及我所做的行:reader = proc.StandardOutput;

3 个答案:

答案 0 :(得分:17)

在框架中内置了一个SyncrhonizedStream,他们只是不公开该类以供您查看/子类等,但您可以使用

将任何流转换为SynchronizedStream
var syncStream = Stream.Synchronized(inStream);

您应该将syncStream对象传递给需要它的每个线程,并确保您永远不会尝试在代码中的其他位置访问inStream。

SynchronizedStream只对所有读/写操作实现一个监视器,以确保线程具有对该流的互斥访问权。

修改

看来他们也在框架中实现了SynchronizedReader / SynchronizedWriter。

var reader = TextReader.Synchronized(process.StandardOutput);

答案 1 :(得分:1)

'线程安全'流并不意味着什么。如果以某种方式共享流,则必须定义可以进行同步/共享的级别。这就数据包(消息或记录)及其允许/要求的顺序而言。

答案 2 :(得分:0)