Можно так: читать сокет в отдельном потоке в цикле. прочитанные строки отправлять в обработчик EventHandler.
public EventHandler<string> OnReadLine;
new Thread() {// псевдокод, не помню точный синтаксис
while (net_stream.DataAvailable) {
tcp_packet = socket_reader.ReadLine();
if (OnReadLine != null)
OnReadLine(this, new SocketEventArgs(tcp_packet));
}
}.start();
public class SocketEventArgs : EventArgs {
public string line;
public SocketEventArgs(string s) {
line = s;
}
}
в итоге можно использовать полученные из сокета строки любым количеством слушателей.
socketWrapper.OnReadLine += (sender, args) => {
// что-то делаем со строчками
}
socketWrapper - в принципе, можно и через статический доступ, у тебя же этот класс щас статический.
отправку данных можно тоже делать в отдельном потоке, выгребая все команды из списка-на-отправку.