Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通信中断时紧凑框架的问题_C#_Sockets_Compact Framework_Backgroundworker - Fatal编程技术网

C# 通信中断时紧凑框架的问题

C# 通信中断时紧凑框架的问题,c#,sockets,compact-framework,backgroundworker,C#,Sockets,Compact Framework,Backgroundworker,我的手持设备出现问题,该设备应该正在侦听来自服务器应用程序的消息。当设备与我的服务器所在的网络失去连接时,此后台工作程序(从OpenNetCF实现)停止响应。我已将消息放置在ProgressChanged和RunWorkerCompleted事件中,以查看它们何时被引发,并在以下代码中,在while循环的receiveFrom之后,在循环终止之后,以及在所有异常中。我根本看不到来自异常或while循环之后的消息,这些消息在连接丢失后停止。所有消息都是通过在可见标签中设置文本来显示的,标签的背景颜

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

  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");
      }
  }
private void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker WWWorker=(BackgroundWorker)发送方;
字节[]wBytes=新字节[4096];
字符串wsReceive;
端点Wremotep=(端点)新IPEndPoint(IPAddress.Any,0);
尝试
{
while(true)
{
if(WWWorker.CancellationPending)
{
打破
}
mSocket.ReceiveFrom(wBytes,ref-wremotep);
如果(wBytes.Length<1)
{
继续;
}
wsReceive=Encoding.ASCII.GetString(wBytes,0,wBytes.Length);
wWorker.ReportProgress(0,wsReceive);
}
mSocket.Close();
}
捕获(线程异常)
{
}
捕获(线程状态异常)
{
}
捕获(例外E)
{
MessageBox.Show(如消息“通信错误”);
}
}
右起:

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

因此,当通信中断时,您无法无限期地从呼叫块接收和接收信息。它将在等待数据时停止报告任何内容,但线程仍处于活动状态,因此BackgroundWorker无法重新运行。

右起:

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

因此,当通信中断时,您无法无限期地从呼叫块接收和接收信息。它将在等待数据时停止报告任何内容,但线程仍处于活动状态,因此BackgroundWorker无法重新运行。

仅我的2美分:

每当实现套接字通信时,我都会将收到的0字节视为远程服务器已正常关闭的指示。我认为您也应该处理这个问题,以开始重新连接尝试,而不仅仅是“继续”循环。

仅我的2美分:


每当实现套接字通信时,我都会将收到的0字节视为远程服务器已正常关闭的指示。我认为您也应该将其视为开始重新连接尝试,而不是仅仅“继续”循环。

这是否意味着当恢复连接并由服务器发送数据时,客户端ReceiveFrom将再次侦听?似乎没有,套接字仍然有效吗?只是快速跟进,对套接字进行If检查。Available似乎可以避免ReceiveFrom上的挂起问题,现在循环停止,后台工作进程停止,我可以在RunWorkerCompleted中重新启动它。我现在有一个OutOfMemory异常被抛出,我必须追查。感谢您的帮助。这是否意味着当连接恢复,并且服务器发送数据时,客户端接收到的将再次侦听?似乎没有,套接字仍然有效吗?只是快速跟进,对套接字进行If检查。Available似乎可以避免ReceiveFrom上的挂起问题,现在循环停止,后台工作进程停止,我可以在RunWorkerCompleted中重新启动它。我现在有一个OutOfMemory异常被抛出,我必须追查。谢谢你的帮助。如果你不介意我问,你会如何在这种情况下重新连接?如果你不介意我问,你会如何在这种情况下重新连接?