首先我想告诉你为什么你会遇到这样的问题。
您正在主线程(UI 线程)中执行“繁重”操作,并且当该线程忙于处理任务(检查用户和密码)时,它不会响应 UI 消息。也就是说,它不会检查消息队列是否为空,因此在操作结束之前它不会对您的点击进行任何操作。
其次,我想找到几种方法来解决它。
解决方案 1使用后台线程来完成工作
using System.Threading;
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() => {
this.Invoke(new Action(() => {
string spl = textBox5.Text;
int lin = textBox4.Lines.Count();
for (int i = 0; i < lin; i++) {
string dick = textBox4.Lines[i];
Convert.ToString(dick);
string[] wordArray = dick.Split(':');
textBox1.Text = (Convert.ToString(wordArray[0]));
textBox2.Text = (Convert.ToString(wordArray[1]));
login();
}
}));
});
thread.Start();
}
通过这种方式,您的 UI 在您进行操作时会响应您。
方案2使用BackgroundWorker
与方案1类似,只需将用户创建的后台线程替换为System.ComponentModel.BackgroundWorker即可,BackgroundWorker 的使用方法见https://msdn.microsoft.com/zh-cn /library/system.componentmodel.backgroundworker.aspx了解更多信息。
解决方案 3使用 ThreadPool
使用 System.Threading.ThreadPool 创建后台线程为您工作。这样,您就不必自己管理线程。更多信息请参见https://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(v=VS.80).aspx
解决方案 4使用任务
使用 System.Threading.Task 执行您的操作。请参阅 msdn:
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx
注意:System.Threading.Task可从 .NET Framework 4.0 获得。
顺便说一句,如果您使用上述解决方案,请记住使用Form.Invoke()来访问您在表单上的控件,或者将Control.CheckForIllegalCrossThreadCalls设置为 false。