我的連接處理器的下方(這是比較個人的實驗不是生產代碼)C#的高CPU使用率,睡眠缺失斷開
如果我不while循環的任意位置添加一個Thread.sleep代碼,它開始吸收CPU。相反,如果我通過睡眠來緩解無盡的垃圾郵件,我錯過了斷開連接.CPU與客戶端/線程運行數量成正比,因此它不是偵聽器本身導致高使用率,這是實際的客戶端線程下面張貼..任何人有任何想法如何解決這個問題?
(我回避的await爲基礎的解決方案,我不熟悉不夠用異步/等待和螺紋方法爲這個相當小的項目工作的罰款)
我只簡要地四處搜尋SO尋找解決方案,並沒有注意到這是什麼特定的問題,或提供了一個解決方案,而不是指導人們異步/等待文章,所以很抱歉,如果我沒有錯過適用的答案。
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'變種 – MickyD
你是什麼意思你錯過了斷開?你是說在斷開連接後客戶端仍然連接,並且你被困在第一個'while'循環中? – TyCobb
@TyCobb是的 - 我的意思是丟失斷開連接是遠程連接發送「DSC」並且丟棄,然後ParseMsg(r)看到並正常關閉連接。但是如果上面的while-thread有一個Sleep() ,它從來沒有收到信息。而且,即使在遠程客戶端丟失後,_client.Connected也不會切換爲false。 – MisterNad