在 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()' 方法启动后台线程。

请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行适当的修改和调整。

WinForms TCP 端口循环检测与自动重连 - 不卡界面

原文地址: https://www.cveoy.top/t/topic/hdOW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录