2016-06-03 3 views
1

Я строй быстрого небольшого скрипта, чтобы принимать данные из приложения я создал для моего телефона и поместить его в текстовом поле и она прекрасно работает с этим кодом:гнездо потока выходит после отключения

private void workerVoid() 
{ 
    string receivedDataString = null; 
    listenSock.Listen(3); 
    acceptedSock = listenSock.Accept(); 
    listenSock.Bind(new IPEndPoint(IPAddress.Any, 5665)); 


    while(shouldRun) 
    { 

     while (listenSock.SendBufferSize != 0) 
     { 
      Buffer = new byte[listenSock.SendBufferSize]; 
      int byteCount = acceptedSock.Receive(Buffer); 

      byte[] byteFormatted = new byte[byteCount]; 

      for (int byteCounter = 0; byteCounter < byteCount; byteCounter++) 
      { 
       byteFormatted[byteCounter] = Buffer[byteCounter]; 
      } 

      receivedDataString = Encoding.ASCII.GetString(byteFormatted); 
      setTextDelegate sTD = new setTextDelegate(setText); 
      reqFormVar.Invoke(sTD, new object[] { receivedDataString }); 

     } 
    } 


} 

С workerVoid будучи нить. Опять же, это прекрасно работает, когда устройство, которое подключено (мой телефон) отключается, поток полностью перестает работать (я получаю поток .. вышел из визуальной студии), и мое устройство не может подключиться после этого, хотя у меня есть цикл while, который должен работать вечно.

Как это сделать, чтобы мое устройство снова подключалось после отсоединения без выхода потока?

Благодаря

+0

Вы не включать любой код, который работает на переменной shouldRun. Установлено ли значение false где-то за пределами включенного кода, пока ваш поток выполняет итерацию во внутреннем цикле? –

ответ

0

Ваш код может вызвать исключение, в результате чего цикл в то время как следует игнорировать, чтобы избежать этого. Surround ваших внутреннее время цикла в попытке поймать, и двигаться замедление внутри фиксирующий блок Ьги так:

var shouldRun = true; 
    while(shouldRun) 
    { 
     try 
     { 
       string receivedDataString = null; 
       listenSock.Listen(3); 
       acceptedSock = listenSock.Accept(); 
       listenSock.Bind(new IPEndPoint(IPAddress.Any, 5665)); 

      while (listenSock.SendBufferSize != 0) 
      { 
        ... 
      } 
     } 
     catch 
     { 
     } 
    } 
+0

Хорошо, я думаю, что я нашел, в чем проблема ... Если я помещаю сообщение в «receiveddatastring =», он работает так, как ожидалось, и он отображает только сообщение, когда данные получены. Однако, когда я отключусь, я получаю сообщение об отключении, а затем он постоянно выводит пустые сообщения, что означает, что sendbuffersize по какой-то причине не 0) – user265889

+0

Потому что, если вы не изменили его, SendBufferSize - 8192, https://msdn.microsoft.com/en -us/library/system.net.sockets.socket.sendbuffersize% 28v = vs.110% 29.aspx Это размер буфера, а не количество данных. Вы должны проверить, что возвращает «Receive», что говорит вам, сколько данных было прочитано. 'SendBufferSize' по существу является" постоянным " – dman2306

Смежные вопросы