-4

我正在研究使用 ssh 登录到 linux 设备的东西。然后我想每5秒监控一次连接状态。我试图用后台工作人员来做,但我在跨线程方面遇到了很多问题。所以我手动创建了新线程并使用委托处理了跨线程。

但我的工作不是很好。例如,在登录期间 UI 堆栈几秒钟,直到登录完成。

这是我正在使用的登录代码:

    private void login_button_Click(object sender, EventArgs e)
    {
        toolStripProgressBar1.Visible = true;
        status.Text = "Connecting...";
        Thread t = new Thread(check_del_login);
        t.IsBackground = true;
        t.Start();
    }
    delegate void del();
    private void check_del_login()
    {
        if (this.InvokeRequired)
        {
            del d = new del(login);
            Invoke(d);
        }
        else
        {
            login();
        }
    }
    private void login()
    {
        ssh = new ssh_login(ip_addr, ssh_username, ssh_password);
        f = new Form3();
        f.sftp(ip_addr, ssh_username, ssh_password);// Send the information to the new form
        try
        {
            ssh.login1();//Connect
            ssh.login2();//Connect
        }
        catch (Exception ex)
        {
            log(ex);
        }
        if (!ssh.check_login1() || !ssh.check_login2())
        {
            MessageBox.Show("Could not login by SSH to " + ip_addr);
            return;
        }
        try
        {
            f.login();// Login with sftp
        }
        catch (Exception ex)
        {
            log(ex);
        }
        if (!f.check_connection())
        {
            MessageBox.Show("Could not login by web to " + ip_addr);
            return;
        }
        toolStripProgressBar1.Visible = false;// hide the progress bar when the process finishes
        if (ssh.check_login1() && ssh.check_login2() && f.check_connection())
        {
            status.Text = "Connected";
            connection_status_timer.Start();
            status.Text = "Updating interface list...";
            Thread t = new Thread(check_del_update_interface);
            t.IsBackground = true;
            t.Start();
            show_form();
            hide_login();
        }
        else
        {
            status.Text = "Disconnected";
            hide_form();
            show_login();
            comboBox_interface.Items.Clear();
            comboBox_interface.Items.Insert(0, "any");
            connection_status_timer.Stop();
        }
    }

我浏览了所有可以在网上找到的指南,但我就是不明白我做错了什么。

提前致谢。

4

1 回答 1

3

您的直接问题是check_del_login() 它总是 Invoke() 主要的 login() 方法。这意味着您的实际代码再次在主线程上运行。

private void check_del_login()   // is run on a thread
{
    if (this.InvokeRequired)     // always true
    {
        del d = new del(login);  // so, run login() on Main thread again
        Invoke(d);
    }
    else
    {
        login();
    }
}

您应该简单地消除 thos 方法并login()直接在线程上运行。但后来你遇到(只是第一个):

 toolStripProgressBar1.Visible = false;// hide the progress bar when the process finishes

此方法涉及 GUI,因此应该调用它。而且你有很多类似的代码。

最佳建议:回到 Backgroundworker 并修复您的 UI 问题。

于 2013-04-20T11:56:25.957 回答