Я собирался редактировать свое сообщение, но оно должно быть полностью отделено от моего последнего.
На мой взгляд, ваша логика неверна, в ConnectionWrapper у вас должен быть поток, который запускает StreamReader, извлекающий сообщения и помещающий их в очередь. Эта очередь затем уведомляет слушателей об изменении. Затем слушатели сами приходят и извлекают данные и решают, что с ними делать.
class ConnectionWrapper {
NetworkStream stream;
StreamReader reader;
Endpoint endPoint;
bool endOfStream;
int maxRetries = 5;
ArrayList arr;
public void connect() {
// ... code to initialize a (TCP) socket to endPoint
this.stream = new NetworkStream(socket, true);
this.reader = new StreamReader(stream);
}
private void initReceiverThread() {
String line;
while(stream.isConnected() && (line = reader.readLine()) != null) {
// notify observers of a change
arr.add(line);
}
}
}
Это псевдокод, предупреждаю вас, я никогда не делал этого на C #. Типичный читатель на самом деле ждет в операторе readLine, поэтому цикл while не сойдет с ума. Также лучше поместить код initReceiverThread в поток, чтобы он не блокировал остальную часть приложения. Уведомив наблюдателей об изменениях, они могут затем пойти и получить ArrayList, выполнив что-то вроде myConnectionWrapper.getMessages (); который будет возвращать ArrayList, но одновременно очищать ArrayList, например, так:
public ArrayList getMessages() {
ArrayList temp = arr;
arr.clear();
return temp;
}
Таким образом, вы получаете ВСЕ сообщения и удаляете их из очереди.
Я раньше писал сетевых клиентов, и это общий дизайн одного из них. У вас будет два потока, которые постоянно вращаются: один для получения сообщений и один для их отправки.
Логика должна быть связана с каким-то кодом менеджера, чтобы определить, продолжить ли, или переподключиться, или что вы хотите сделать.