C #, существует ли такая вещь, как потокобезопасный поток? - PullRequest
7 голосов
/ 25 июля 2011

Я перенаправляю вывод процесса в потоковый ридер, который читаю позже.Моя проблема в том, что я использую несколько потоков, которые ДОЛЖНЫ иметь отдельные экземпляры этого потока.Когда я иду, чтобы прочитать этот поток, потоки помечаются и начинают выполняться странным образом.Есть ли такая вещь, как создание потокобезопасного потока? РЕДАКТИРОВАТЬ: Я установил блокировки на ReadToEnd на потоковом считывателе и строке, где я сделал:

Ответы [ 3 ]

17 голосов
/ 25 июля 2011

В инфраструктуру встроен SyncrhonizedStream, они просто не предоставляют класс для просмотра / подкласса и т. Д., Но вы можете превратить любой поток в SynchronizedStream, используя

var syncStream = Stream.Synchronized(inStream);

Вы должны передатьобъект syncStream для каждого потока, который в этом нуждается, и убедитесь, что вы никогда не пытаетесь получить доступ к inStream в другом месте кода.

SynchronizedStream просто реализует монитор для всех операций чтения / записи, чтобы гарантировать, что поток имеет взаимоисключающиедоступ к потоку.

Редактировать:

Похоже, они также реализуют SynchronizedReader / SynchronizedWriter в рамках.

var reader = TextReader.Synchronized(process.StandardOutput);
1 голос
/ 25 июля 2011

Поток "потокобезопасный" на самом деле ничего не значит.Если поток каким-то образом является общим, вы должны определить, на каком уровне может выполняться синхронизация / совместное использование.Это с точки зрения пакетов данных (сообщений или записей) и их разрешенного / требуемого порядка.

0 голосов
/ 25 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...