我做了一个简短的程序,用户输入计算机的IP地址,然后程序通过尝试使用端口80连接计算机来检查计算机是否在线(假设计算机是打开,它连接到互联网)。
现在问题是,每当我点击“开始”按钮时,它几秒钟内什么都不做,然后崩溃。
以下是代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Online_Checker
{
public partial class Form1 : Form
{
int success;
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress.Text), 80);
while (true)
{
success = 1;
try { client.Connect(ep); }
catch { status.BackColor = Color.Red; status.Text = "OFFLINE"; success = 0; }
if (success == 1)
{
status.BackColor = Color.Red;
status.Text = "ONLINE";
client.Close();
}
Thread.Sleep(5000);
}
}
}
}
正如您所看到的,我甚至在每次检查之间延迟了5秒钟,以确保它不会崩溃。
那么问题出在哪里?我该如何解决?
答案 0 :(得分:1)
您不能在UI线程上执行无限的while / sleep循环:UI线程需要为Windows事件队列提供服务 - 如果忽略它,则无法绘制并记录为“无响应”。
请考虑使用计时器或后台工作人员。
答案 1 :(得分:1)
您正在实施UDP套接字。 According to MSDN,
由于
UDP
协议是无连接的,Connect
方法不是 块。
Catch
没有错误;因此,你在主线程上输入一个无限循环。
建议的解决方案:
Connect
方法不是异步的。现在,您正在尝试确定计算机是否处于活动状态。您可以尝试实现Ping。这是一个关于SO的类似问题,它有 mef 的答案来解决这个问题:
What is the best way to check for Internet connectivity using .NET?
希望它适合你。