通信丢失时Compact Framework的问题

时间:2011-06-03 12:58:22

标签: c# sockets compact-framework backgroundworker

我在手持设备上遇到问题,该设备应该侦听来自我的服务器应用程序的消息。当设备失去与网络的连接时,我的服务器处于打开状态,此后台工作程序(从OpenNetCF实现)停止响应。我已经在ProgressChanged和RunWorkerCompleted事件中放置了消息,以查看它们何时被引发,并在while循环中的RecieveFrom之后,以及循环终止之后以及所有异常中的以下代码中。我没有看到来自异常的消息,或者根本没有看到while循环之后的消息,并且在连接丢失后消息停止。通过在可见标签中设置文本来显示所有消息,标签的背景颜色发生变化,以便我可以看到循环是否正在运行。即使在重新获得连接之后,循环似乎也停止运行,并且尝试重新运行后台工作程序会生成“已在使用中”的异常。那么,为什么工人在继续跑步时会停止响应呢?

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  {
      BackgroundWorker wWorker = (BackgroundWorker)sender;
      byte[] wBytes = new Byte[4096];
      string wsReceive;
      EndPoint wRemoteEP = (EndPoint)new IPEndPoint(IPAddress.Any, 0);

      try
      {
          while (true)
          {
              if (wWorker.CancellationPending)
              {
                  break;
              }

              mSocket.ReceiveFrom(wBytes, ref wRemoteEP);
              if (wBytes.Length < 1)
              {
                  continue;
              }
              wsReceive = Encoding.ASCII.GetString(wBytes, 0, wBytes.Length);

              wWorker.ReportProgress(0, wsReceive);
          }
          mSocket.Close();
      }
      catch (ThreadAbortException)
      {
      }
      catch (ThreadStateException)
      {
      }
      catch (Exception E)
      {
          MessageBox.Show(E.Message, "Communication Error");
      }
  }

2 个答案:

答案 0 :(得分:1)

the docs on Socket.ReceiveFrom开始:

  

如果没有可用于读取的数据,则ReceiveFrom方法将阻止,直到数据可用

因此,当通信丢失时,您将无法接收并且您的ReceiveFrom呼叫无限期地阻止。它会在等待数据时停止报告任何内容,但该线程仍处于活动状态,因此无法重新运行BackgroundWorker。

答案 1 :(得分:0)

我的2美分:

每当我实现套接字通信时,我会将接收的0个字节视为远程服务器已正常关闭的指示。我认为你也应该对此进行处理以启动重新连接尝试,而不仅仅是“继续”循环。