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

2019-02-22 00:33发布

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;

3条回答
老娘就宠你
2楼-- · 2019-02-22 01:02

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楼-- · 2019-02-22 01:18

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);
查看更多
登录 后发表回答