0
我有檢查是用戶在線的TcpClient Stream.Read結束線程意外
var user = (User)userObj;
if (!IsUserOnline(user)) return;
if (!TryToConnect(user)) return;
var TCP = user.CmdTCP;
Stream stm = TCP.GetStream();
這成功地完成每次一個線程,但我
stm.Write(GetBytes("chk"), 0, 3);
然後
var bb = new byte[1];
try {
stm.Read(bb, 0, 1);
} catch (Exception e) { /*error*/ }
if (bb[0] == CHR_SUCCESS) {
//etc etc
}
如果用戶第二次上網,則流讀取失敗並且沒有警告。沒有例外,代碼不會更進一步。線程停止,程序運行。
整個主題:
var user = (User)userObj;
if (!IsUserOnline(user)) return;
if (!TryToConnect(user)) return;
var TCP = user.CmdTCP;
Stream stm = TCP.GetStream();
try {
stm.Write(GB("chk"), 0, 3);
toLog("refresh::chk sent ;)");
} catch (Exception e) {
#region unable to send packet, online
toLog("\trefresh::" + user.name + " is online (Connected, unable to send packet) " + e.Message);
setUserStatus(user, userStatus.Online);
return;
#endregion
}
var bb = new byte[1];
try {
stm.Read(bb, 0, 1); //<<<<<<<<< here thread just ends, no toLog("..");, no exception
toLog("refresh::got " + (char)bb[0]);
} catch (Exception e) {
#region unable to get packet, online
toLog("\trefresh::" + user.name + " is online (Connected, unable to get packet) " + e.Message);
setUserStatus(user, userStatus.Online);
return;
#endregion
}
if (bb[0] == CHR_SUCCESS) {
try {
stm.Write(GB(toStr(CHR_SSUCCESS)), 0, 1);
toLog("refresh::CHR_SSUCCESS sent ;)");
} catch (Exception e) {
#region unable to send packet 2, online
toLog("\trefresh::" user.name + " is online (Connected, unable to send packet #2) " + e.Message);
setUserStatus(user, userStatus.Online);
return;
#endregion
}
toLog("\trefresh::" + user.name + " is online");
setUserStatus(user, userStatus.Online);
} else {
for (int x = 0; x < 5; x++) {
toLog("\t\trefresh::got wrong answer");
System.Media.SystemSounds.Beep.Play();
Thread.Sleep(500);
}
setUserStatus(user, userStatus.Online);
}
「線程剛停止」是指「掛起」還是「中斷」? – 2013-04-27 08:06:10
線程剛剛退出。 – 2013-04-27 08:07:25
問題中的代碼剛剛脫離了上下文,不是嗎?你可以發佈線程運行在一個大單塊中的整個代碼嗎? (如果它不是太大,當然) – 2013-04-27 08:23:18