У меня есть простая C# Windows Presentation Framework программа, которая порождает TCP Listener. Этот прослушиватель TCP принимает сокет от соединения, которое я затем хочу иметь возможность получать и отправлять данные.
Я не был уверен, как это сделать с тем же сокетом, поэтому я настроил этот l oop.
По существу в начале каждого l oop, проверка с таймаутом (я думаю, 10 мс) для новых данных, затем независимо от новых данных, продолжающих посылать данные, если применимо. Если бы у меня не было тайм-аута, я бы не смог отправить данные без предварительного получения данных, так как вызов socket.recieve заблокировал бы, пока у нас не было чего-либо.
Однако этот тайм-аут вызывает ужасную задержку в моем приложении. Несмотря на работу в другом кадре! Из тестирования, как только я убираю тайм-аут, задержка исчезает. Так что я совершенно уверен, что в этом проблема.
Это заставляет меня задуматься, это неправильный способ сделать это? Должен ли я использовать этот Asyn c Получать вызов вместо этого? Я не думал, что это было решением, но я не уверен. Есть лучший способ сделать это? Полагаю, целенаправленное выбрасывание этого исключения очень плохо сказывается на производительности.
System.Net.IPAddress localAddr = System.Net.IPAddress.Parse("127.0.0.1);
TcpListener mListener = new TcpListener(localAddr, 5000);
var thread = new System.ThreadingThread(() => {
mListener.Start();
//Loop Forever
mListener.Start();
while(true){
Socket client = mListener.AcceptSocket();
client.ReceiveTimeout = 10;
while(true){
byte[] data = new byte[5000];
int returnsize = 0;
try{
returnSize = client.Recieve(data);
}catch(Exception e){
//Client Timeout!
//We will catch a data on the next loop
}
//now here I would check here if a queue has data to send
//if so use client.send
//proceed to next loop
}
}
});
thread.Start();
Спасибо за помощь!