我正在将进程的输出重定向到流读取器,我稍后会阅读。我的问题是我正在使用多个线程,它应该有这个流的单独实例。当我去读这个流时,线程捏造并开始奇怪地执行。
是否存在制作线程安全流的问题?
编辑:我在streamreader上的ReadToEnd上设置了锁,以及我所做的行:reader = proc.StandardOutput;
答案 0 :(得分:17)
在框架中内置了一个SyncrhonizedStream,他们只是不公开该类以供您查看/子类等,但您可以使用
将任何流转换为SynchronizedStreamvar syncStream = Stream.Synchronized(inStream);
您应该将syncStream对象传递给需要它的每个线程,并确保您永远不会尝试在代码中的其他位置访问inStream。
SynchronizedStream只对所有读/写操作实现一个监视器,以确保线程具有对该流的互斥访问权。
修改强>
看来他们也在框架中实现了SynchronizedReader / SynchronizedWriter。
var reader = TextReader.Synchronized(process.StandardOutput);
答案 1 :(得分:1)
'线程安全'流并不意味着什么。如果以某种方式共享流,则必须定义可以进行同步/共享的级别。这就数据包(消息或记录)及其允许/要求的顺序而言。
答案 2 :(得分:0)