先看我的代码 private void commTest()
{
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping())
{
ping.PingCompleted += ping_PingCompleted;
ping.SendAsync(_ip, null);
}
}
private void ping_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e)
{
if (e.Cancelled)
{
_isConnected = false;
labelStatus.Text = "连接测试被取消";
return;
}
if (e.Error != null)
{
labelStatus.Text = e.Error.Message;
_isConnected = false;
return;
}
if (e.Reply.Status == System.Net.NetworkInformation.IPStatus.Success)
{
labelStatus.Text = "已连接";
_isConnected = true;
return;
}
else
{
labelStatus.Text = "连接错误";
_isConnected = false;
return;
}
}
这样写的话,在我自己的机器上试了很多次一点问题没有,但是用到客户的机器上ping另外一个机器就会直接进入e.cancelled分支。
请问这是为什么?
后来我在ping.SendAsync(_ip, null); 后面加了一个System.Threading.Thread.Sleep(2000);就没事了。
我觉得就算是超时报警也不应该是cancel啊,它直接报个错都行。ping类
{
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping())
{
ping.PingCompleted += ping_PingCompleted;
ping.SendAsync(_ip, null);
}
}
private void ping_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e)
{
if (e.Cancelled)
{
_isConnected = false;
labelStatus.Text = "连接测试被取消";
return;
}
if (e.Error != null)
{
labelStatus.Text = e.Error.Message;
_isConnected = false;
return;
}
if (e.Reply.Status == System.Net.NetworkInformation.IPStatus.Success)
{
labelStatus.Text = "已连接";
_isConnected = true;
return;
}
else
{
labelStatus.Text = "连接错误";
_isConnected = false;
return;
}
}
这样写的话,在我自己的机器上试了很多次一点问题没有,但是用到客户的机器上ping另外一个机器就会直接进入e.cancelled分支。
请问这是为什么?
后来我在ping.SendAsync(_ip, null); 后面加了一个System.Threading.Thread.Sleep(2000);就没事了。
我觉得就算是超时报警也不应该是cancel啊,它直接报个错都行。ping类
http://msdn.microsoft.com/zh-cn/library/system.net.networkinformation.ping.aspx
同时这个例子的疑惑也说明你对多线程的不理解,更多多线程内容可以参考我的博客:
http://blog.csdn.net/lizhi3186575/article/details/8991281