gpt4 book ai didi

c# - 如何在函数运行时更新表单

转载 作者:行者123 更新时间:2023-11-30 23:33:53 24 4
gpt4 key购买 nike

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

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 行解释,因为我只在理论上了解线程,而我自己从未使用过它。感谢您的关注。

最佳答案

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

使用Background Worker Threads来完成这个。另一个很好的例子:Background thread for beginners


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

    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。

关于c# - 如何在函数运行时更新表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33706522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com