这次的另一个网络问题与至少在这个初始版本中基于 MSDN 示例的 Async Socket Client 有关。当前,当用户单击界面上的按钮时,会尝试异步连接以连接到联网设备,代码如下所示 -
//Mouse Event handler for main thread
private void btn_Read_MouseDown(object sender, MouseEventArgs e)
{
Stopwatch sw = Stopwatch.StartNew();
if (!networkDev.Connected)
networkDev.Connect("192.168.1.176", 1025);
if(networkDev.Connected)
networkDev.getReading();
sw.Stop();//Time time taken...
}
如果端点已打开并存在于网络上,则此代码可以正常工作(整个操作不到一秒)。但是,如果联网设备被关闭或不可用,AsyncSocket Connect 函数会阻止主窗体线程。目前,如果设备不可用,整个界面会锁定大约 20 秒(使用秒表)。我认为我正在锁定,因为主线程正在等待连接请求的返回,这是否意味着我需要将该连接请求放在另一个线程上?
我已经包含了我正在使用的异步套接字客户端的代码 -
public bool Connect(String ip_address, UInt16 port)
{
bool success = false;
try
{
IPAddress ip;
success = IPAddress.TryParse(ip_address, out ip);
if (success)
success = Connect(ip, port);
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
return success;
}
public bool Connect(IPAddress ip_address, UInt16 port)
{
mSocket.BeginConnect(ip_address, port,
new AsyncCallback(ConnectCallback), mSocket);
connectDone.WaitOne();//Blocks until the connect operation completes,
//(time taken?) timeout?
return mSocket.Connected;
}
private void ConnectCallback(IAsyncResult ar)
{
//Retreive the socket from thestate object
try
{
Socket mSocket = (Socket)ar.AsyncState;
//Set signal for Connect done so that thread will come out of
//WaitOne state and continue
connectDone.Set();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
}
我希望通过使用具有自己线程的异步客户端,如果主机不存在,这将停止冻结接口,但情况似乎并非如此。在 20 秒的初始连接失败后,所有后续连接尝试都会立即返回(不到一毫秒)。还有一点我觉得很奇怪,如果初始连接尝试成功,任何稍后连接到不存在的主机的调用都会立即返回。对正在发生的事情感到有些困惑,但想知道这是否与我使用的 Socket 存储在我的 AsyncSocket 类中这一事实有关。非常感谢任何帮助,如果需要更多客户端代码,请告诉我。