Как сделать обновление формы во время работы функции

У меня есть функция, которая пытается подключиться к серверу и публиковать информацию о ходе и результате. но я только что узнал, что, пока моя функция работает, приложение будет "зависать", и, поскольку все связующее может занять некоторое время, пользователь может подумать, что приложение работает со сбоями, и попытаться выйти. Знаете ли вы, как заставить функцию обновлять форму, прежде чем продолжить оставшуюся функцию, чтобы пользователь знал, что приложение работает.

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 строки объяснения, так как я знаю только многопоточность теоретически и никогда не использовал ее сам. Спасибо за внимание.

1 ответ

Решение

Причина, по которой ваше приложение зависает, заключается в том, что все работает в потоке пользовательского интерфейса. Если вы отделите свою занятую функцию от отдельного потока, замораживание не произойдет.

Для этого используйте фоновые рабочие потоки. Еще один замечательный пример: фоновая тема для начинающих


Использовал второй пример ссылок в качестве источника

    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 Thread дружественным или использовать хак Invoke/BeginInvoke.

Другие вопросы по тегам