2

我有一个尝试连接到服务器并发布有关进度和结果的信息的功能。但我刚刚发现,当我的功能运行时,应用程序将“冻结”,并且由于整个连接可能需要一段时间,用户可能会认为应用程序出现故障并尝试退出。您是否知道如何在继续其余功能之前获取更新表单的功能,以便用户知道应用程序正在运行。

private void TestConnection()
{
    ResutBoxTable.Controls.Clear();
    ResutBoxTable.RowStyles.Clear();
    PrintResults("Starting connection test...", Color.White);
    ImapClient client = new ImapClient(IncAddressTxt.Text, true, certificateCheckbox.Checked);
    if (client.Connect())
    {
        PrintResults("Connection to incoming mail server succesful!",Color.Green );
        PrintResults("Attempting to Login to incoming mail server...", Color.White);
        if (client.Login(UserTxt.Text,PasswordTxt.Text))
        {
            PrintResults("Login to incoming mail server succesful succesfull!",Color.Green);
        }
        else
        {
            PrintResults("Failed to login to incoming mail server!", Color.Red);
            PrintResults("Please check your login information and try agian.", Color.Red);
        }
    }
    else
    {
        PrintResults("Failed to connect to incoming mail server!", Color.Red);
        PrintResults("Please check your connection prameters and try again.", Color.Red);
    }
    PrintResults("Testing connection complete!",Color.White);
}

另外,如果您的答案与线程有关,请抛出 1 或 2 条解释行,因为我只在理论上知道线程并且从未自己使用过。感谢您的关注。

4

1 回答 1

2

您的应用程序冻结的原因是因为一切都在 UI 线程上运行。如果您将繁忙的功能分离到一个单独的线程,则不会发生冻结。

使用后台工作线程来完成此操作。另一个很好的例子:初学者的后台线程


使用第二个链接示例作为源

    BackgroundWorker m_oWorker;

    public Form1()
    {
        InitializeComponent();
        m_oWorker = new BackgroundWorker();

        // Create a background worker thread that ReportsProgress &
        // SupportsCancellation
        // Hook up the appropriate events.
        m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);

        //optional progress indicators
        m_oWorker.ProgressChanged += new ProgressChangedEventHandler
                (m_oWorker_ProgressChanged);
        m_oWorker.WorkerReportsProgress = true;
    }

    void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //Run your primary function
        TestConnection();

        //Progress indicator - optional
        m_oWorker.ReportProgress(100);
    }
    //optional
    void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        //Report progress

    }

此外,作为旁注,您需要使PrintResults线程友好或使用 Invoke/BeginInvoke hack。

于 2015-11-14T08:28:00.837 回答