Реализация Pipe в C # - какие (потоковые?) Классы использовать? - PullRequest
2 голосов
/ 27 декабря 2010

Мне трудно понять, как работать с потоками в C #.

Я планирую иметь класс этой формы:

class Pipe {
    public void PutChar(char c) { ... }
    public char GetChar() { ... }
}

Идея состоит в том, что один поток будетпоместите символы в этот Pipe через метод PutChar(), а позже другой поток будет использовать GetChar() для получения символов, которые находятся в Pipe.

В Java я бы использовалPipedReader и PipedWriter классов.Кажется, в C # нет эквивалентных классов, поэтому какие (потоковые?) Классы мне следует использовать здесь?Или потоки не являются правильным способом реализации этого?Может, мне лучше использовать Queue вместо этого?

Спасибо

Ответы [ 5 ]

4 голосов
/ 27 декабря 2010

Поскольку вы хотите общаться между потоками и не хотите использовать какие-либо NamedPipes, как упомянуто в ответах выше, чем

1 - Вы можете создать очередь потребителя.

2 - Есливы используете .net 4.0, чем ConcurrentQueue можно использовать.

1 голос
/ 27 декабря 2010

Если вы используете .NET 4.0, взгляните на BlockingCollection и Task Parallel Library. Эти два вместе создают отличный способ для перемещения данных между потоками с помощью задач.

Пример кода на MSDN показывает все, что вам нужно сделать.

1 голос
/ 27 декабря 2010

Найдите в пространстве имен System.IO.Pipes классы, которые могут передаваться в каналы. Однако вы можете рассмотреть WCF , используя NetNamedPipeBinding для реализации каналов в вашем приложении.

0 голосов
/ 27 декабря 2010

StreamReader & StreamWriter очень похожи на PipedReader & PipedWriter.Если вы объявите MemoryStream для хранения буфера, вы можете реализовать его.

Ниже приведен краткий пример кода, который может сделать то, что вы ищете.

class Pipe {
    MemoryStream _ms;
    StreamReader _sr;
    StreamWriter _sw;

    public Pipe()
    {
       _ms = new MemoryStream();
       _sr = new StreamReader(_ms);
       _sw = new StreamWriter(_ms);
    }

    public void PutChar(char c) { _sw.Write(c) }
    public char GetChar() { return _sw.Read();  }
}
0 голосов
/ 27 декабря 2010

Взгляните на NamedPipe's .Также взгляните на этот пост.

...