Мой обработчик подключения ниже (это больше для личных экспериментов, чем для производственного кода)
Если я не добавляю Thread.Sleep где-либо в цикле while, он начинает высасывать ЦП. И наоборот, если я делаю Sleep, чтобы облегчить бесконечный спам во время, я пропускаю отключение.. ЦП увеличивается прямо пропорционально к количеству запущенных клиентов/потоков, так что это не сам прослушиватель вызывает высокое использование, а фактический клиентский поток, опубликованный ниже. У кого-нибудь есть идеи о том, как решить эту проблему?
(Я избегаю решений, основанных на ожидании, так как я недостаточно знаком с async/await, а многопоточный метод отлично работает для этого довольно небольшого проекта)
Я только кратко обыскал SO в поисках решения и не заметил ничего, что было бы этой конкретной проблемой или предоставляло решение, кроме направления людей к статьям async/await, так что извините, если я пропустил применимый ответ.
private void HandleConnection(CancellationToken ct) {
int recv = 0;
byte[] buf = new byte[4096];
Trace.WriteLine($"{_name} Connected");
if (_ns.CanWrite && _client.Connected) {
_ns.Write(Encoding.BigEndianUnicode.GetBytes("■WEL"), 0, Encoding.BigEndianUnicode.GetBytes("■WEL").Length);
try {
while (_client.Connected && !ct.IsCancellationRequested) {
while (!_ns.DataAvailable) { //first attempted solution
Thread.Sleep(100); // miss discon if i sleep here
}
if (ct.IsCancellationRequested) {
Trace.WriteLine($"{(string)this} thread aborting");
break;
}
buf = new byte[4096];
if (_client.Connected && _ns.DataAvailable) {
recv = _ns.Read(buf, 0, buf.Length);
} else {
recv = 0;
}
if (recv > 0) {
string r = Encoding.BigEndianUnicode.GetString(buf);
r = r.TrimEnd('\0');
if (String.IsNullOrEmpty(r) || String.IsNullOrWhiteSpace(r))
r = null; //need the !not version
else
if (ParseMsg(r))
break;
}
//Thread.Sleep(100); // also miss discon here too
}
} catch (IOException ioe) { }
Trace.WriteLine($"{_name} Disconnected");
if (OnDisconnected != null)
OnDisconnected(this);
}
}
async/await
вариантов - person MickyD   schedule 10.04.2017while
? - person TyCobb   schedule 10.04.2017