2013-04-27 42 views
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); 
     } 
+0

「線程剛停止」是指「掛起」還是「中斷」? – 2013-04-27 08:06:10

+0

線程剛剛退出。 – 2013-04-27 08:07:25

+0

問題中的代碼剛剛脫離了上下文,不是嗎?你可以發佈線程運行在一個大單塊中的整個代碼嗎? (如果它不是太大,當然) – 2013-04-27 08:23:18

回答