WinForms TCP 端口循环检测与自动重连 - 不卡界面
在 WinForms 中,可以使用 'BackgroundWorker' 组件来创建一个循环线程检测 TCP 端口,并在后台线程中进行重连操作,以避免卡住界面。
首先,在你的 WinForms 窗体上添加一个 'BackgroundWorker' 组件,并命名为 'bgWorker'。
然后,在窗体的代码文件中,添加以下代码:
using System;
using System.ComponentModel;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
namespace WinFormsApp
{
public partial class MainForm : Form
{
private TcpClient _tcpClient;
private bool _isConnected;
public MainForm()
{
InitializeComponent();
// 绑定 BackgroundWorker 事件
bgWorker.DoWork += bgWorker_DoWork;
bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
}
private void MainForm_Load(object sender, EventArgs e)
{
// 启动后台线程
bgWorker.RunWorkerAsync();
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
// 检测是否已连接,如果未连接,则进行连接操作
if (!_isConnected)
{
try
{
// 进行连接操作
_tcpClient = new TcpClient();
_tcpClient.Connect('127.0.0.1', 8080);
_isConnected = true;
// 在后台线程中更新界面,可以使用 Invoke 方法
UpdateUI('已连接');
}
catch (Exception ex)
{
// 连接失败,打印错误信息
Console.WriteLine(ex.Message);
// 等待一段时间后进行重连
Thread.Sleep(5000);
}
}
// 等待一段时间后再次进行循环检测
Thread.Sleep(1000);
}
}
private void UpdateUI(string message)
{
if (InvokeRequired)
{
// 在 UI 线程上调用 UpdateUI 方法
Invoke(new Action<string>(UpdateUI), message);
}
else
{
// 在 UI 线程上更新界面
labelStatus.Text = message;
}
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 后台线程完成时的处理
}
}
}
在上述代码中,我们通过 'BackgroundWorker' 组件创建了一个后台线程,在 'DoWork' 事件中进行循环检测 TCP 端口的操作。如果未连接成功,则在后台线程中进行重连操作,并通过 'Invoke' 方法在 UI 线程上更新界面。
在窗体的 'Load' 事件中,调用 'bgWorker.RunWorkerAsync()' 方法启动后台线程。
请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行适当的修改和调整。
原文地址: https://www.cveoy.top/t/topic/hdOW 著作权归作者所有。请勿转载和采集!