Исходя из моего ограниченного опыта, доступ к одному и тому же сокету из разных потоков является очень опасной идеей, но, предполагая, что то, что вы делаете, является клиентским приложением с графическим интерфейсом, я бы предложил создать поток, который устанавливает соединение, создает событиякогда что-то приходит из сокета и отправляет данные из очереди.
для кодирования состояния соединения, вы можете создать свой собственный enum (вне класса, но в том же пространстве имен, даже в том же файле) для соответствующего соединениятакие состояния, как CONNECTED и DISCONNECTED:
public enum ConnStatus { CONNECTED, DISCONNECTED, FAULTED };
Затем вы можете создать класс, который управляет всеми сокетами, потоками, чтением / записью ... Поток вызовет некоторые события, такие как "messageReceived" и "statusChanged",они должны быть объявлены как поля класса:
public delegate void StringEventHandler(string param);
public StringEventHandler messageReceived;
public delegate void ConnStatusEventHandler(ConnStatus param);
public ConnStatusEventHandler statusChanged;
тогда в потоке вы можете запустить их следующим образом:
try {
clientSocket.Connect(localEndPoint);
statusChanged?.Invoke(ConnStatus.CONNECTED);
while(runThread){
// Send messages in queue
string RX = String.Empty;
//READ from Socket
//perform some basic checks if needed
messageReceived?.Invoke(RX);
}
statusChanged?.Invoke(ConnStatus.DISCONNECTED);
catch {
statusChanged?.Invoke(ConnStatus.FAULTED);
}
finally {
//perform some cleanup
}