C#, is there such a thing as a “thread-safe” stream?

半城伤御伤魂 提交于 2020-03-11 20:09:51

问题


I am redirecting the output of a process into a streamreader which I read later. My problem is I am using multiple threads which SHOULD have separate instances of this stream. When I go to read this stream in, the threading fudges and starts executing oddly.

Is there such a thing as making a thread-safe stream?
EDIT: I put locks on the ReadToEnd on the streamreader, and the line where I did: reader = proc.StandardOutput;


回答1:


There's a SyncrhonizedStream built into the framework, they just don't expose the class for you to look at/subclass etc, but you can turn any stream into a SynchronizedStream using

var syncStream = Stream.Synchronized(inStream);

You should pass the syncStream object around to each thread that needs it, and make sure you never try to access inStream elsewhere in code.

The SynchronizedStream just implements a monitor on all read/write operation to ensure that a thread has mutually exclusive access to the stream.

Edit:

Appears they also implements a SynchronizedReader/SynchronizedWriter in the framework too.

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



回答2:


A 'thread-safe' stream doesn't really mean anything. If the stream is somehow shared you must define on what level synchronization/sharing can take place. This in terms of the data packets (messages or records) and their allowed/required ordering.




回答3:


Found solution here: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/0bccd3d2-b251-41fa-bf81-776c403dcc68



来源:https://stackoverflow.com/questions/6819581/c-is-there-such-a-thing-as-a-thread-safe-stream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!