#c# #thread-safety #named-pipes
#c# #безопасность потоков #именованные каналы
Вопрос:
Я пытаюсь разделить экземпляр NamedPipeServerStream между двумя потоками, читателем и писателем. Программа работает, но когда я пытаюсь создать два экземпляра объекта ServerProcess, поток записи начинает зависать. Где я ошибаюсь?
Любые предложения будут с благодарностью приняты.
Метод порождения заключается в следующем:
public class ServerPrcoess
{
private static NamedPipeServerStream m_NamePipeHandle;
public static void StartPipe()
{
int i = 0;
Thread[] OPCServerReader = new Thread();
Thread[] OPCServerWriter = new Thread();
m_NamePipeHandle = new NamedPipeServerStream(PIPENAME, PipeDirection.InOut, 254, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
m_NamePipeHandle.WaitForConnection();
OPCServerReader = new Thread(PipeReaderThread);
OPCServerReader.IsBackground = true;
OPCServerReader.Start(i);
Thread.Sleep(1000);
OPCServerWriter = new Thread(PipeWriterThread);
OPCServerWriter.IsBackground = true;
OPCServerWriter.Start();
}
}
Поток чтения аналогичен приведенному ниже и создает двоичный объект чтения с использованием дескриптора канала :-
private static void PipeReaderThread(object ThreadNo)
{
Console.WriteLine("Reader Thread Number: {0}", (int)ThreadNo);
try
{
StreamOPCMessageReader oMsgReader = new StreamOPCMessageReader(m_NamePipeHandle);
...
И поток записи выполняет эквивалент, используя тот же дескриптор канала.
private static void PipeWriterThread(object _ThreadNo)
{
int ThreadNo = Thread.CurrentThread.ManagedThreadId;
try
{
StreamOPCMessageWriter oMsgWriter = new StreamOPCMessageWriter(m_NamePipeHandle);
Ответ №1:
Вы не можете создать несколько экземпляров NamedPipeServerStream с одним и тем же именем (PIPENAME).
Комментарии:
1. Если вы инициализируете каждый экземпляр NamedPipeServerStream в своем собственном потоке, тогда я бы подумал, что это не проблема
2. попробуйте выполнить
new Thread(() => {new NamedPipeServerStream("pipe"); Thread.Sleep(1000);}).Start();
дважды