我在手持设备上遇到问题,该设备应该侦听来自我的服务器应用程序的消息。当设备失去与网络的连接时,我的服务器处于打开状态,此后台工作程序(从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");
}
}
答案 0 :(得分:1)
从the docs on Socket.ReceiveFrom
开始:
如果没有可用于读取的数据,则ReceiveFrom方法将阻止,直到数据可用
因此,当通信丢失时,您将无法接收并且您的ReceiveFrom呼叫无限期地阻止。它会在等待数据时停止报告任何内容,但该线程仍处于活动状态,因此无法重新运行BackgroundWorker。
答案 1 :(得分:0)
我的2美分:
每当我实现套接字通信时,我会将接收的0个字节视为远程服务器已正常关闭的指示。我认为你也应该对此进行处理以启动重新连接尝试,而不仅仅是“继续”循环。