如何在函数工作时进行表单更新
本文关键字:表单 更新 工作 函数 | 更新日期: 2023-09-27 18:21:57
我有一个函数,它试图连接到服务器并发布有关进度和结果的信息。但我刚刚发现,当我的功能工作时,应用程序会"冻结",由于整个连接过程可能需要一段时间,用户可能会认为应用程序出现故障,并试图退出。你知道如何让函数更新表单,然后再继续执行其余的函数,这样用户就知道应用程序正在工作。
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);
}
此外,如果你的答案与线程有关,请抛出一两行解释行,因为我只知道线程理论,自己从未使用过。感谢您的关注。
应用程序被冻结的原因是因为所有东西都在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破解。