我试图使用Ping类ping服务器,但是在10次之后该方法返回true,我一直变为false(这意味着服务器已关闭[?]而它不是)这是方法:
public bool IsConnectedToInternet()
{
Ping p = new Ping();
try
{
PingReply reply = p.Send("www.uic.co.il", 1000);
if (reply.Status == IPStatus.Success)
return true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
return false;
}
private void start_Click(object sender, EventArgs e)
{
for (; ; )
{
Console.WriteLine(IsConnectedToInternet);
}
}
为什么我会在一段时间后变得虚假? 谢谢。
答案 0 :(得分:10)
您的服务器充满了请求:
for (; ; )
{
Console.WriteLine(IsConnectedToInternet);
}
将在请求后尽可能快地循环发送请求。
如果您只是编写保持活动服务或服务状态控制的编码,那么使用每分钟甚至每10分钟ping一次的计时器应该足够好。
此外,正如其他人在他们的评论中指出的那样,你通过在getter中执行ping来滥用属性,因为调用可能需要一些时间并且属性getter应该真正返回,如果不是立即那么快。 CheckConnection()
方法有更明确的意图。
答案 1 :(得分:1)
我重写了你的代码。
如果连接丢失,它将触发一个名为ConnectionLost
的事件,当它再次连接时,它将触发一个名为Connected
的事件。
public class NetworkStateMonitor
{
private System.Threading.Timer _timer;
bool _wasConnected = false;
public NetworkStateMonitor()
{
_timer = new System.Threading.Timer(OnPing, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
}
public bool CheckInternetConnection()
{
bool result = false;
Ping p = new Ping();
try
{
PingReply reply = p.Send("www.uic.co.il", 1000);
if (reply.Status == IPStatus.Success)
return true;
catch (PingException)
{
return false;
}
}
private void OnPing(object state)
{
var newState = CheckInternetConnection();
if (!newState && _wasConnected)
ConnectionLost(this, EventArgs.Empty);
else if (newState && !_wasConnected)
Connected(this, EventArgs.Empty);
_wasConnected = newState;
}
public event EventHandler ConnectionLost = delegate{};
public event EventHandler Connected = delegate{};
}
答案 2 :(得分:0)
对于此页面的其他绊脚石,如果将此函数重写为:
,则此功能会更好public bool CheckInternetConnection(string HostName)
{
bool result = false; // assume error
try {
Ping oPing = new Ping();
PingReply reply = oPing.Send(HostName, 3000);
if (reply.Status == IPStatus.Success){
result = true;
}
} catch (Exception E) {
// Uncomment next line to see errors
// MessageBox.Show(E.ToString());
}
return result;
}
现在拨打电话:
bool IsSuccessful = CheckInternetConnection("www.uic.co.il");