🔥 WaitingForm
关闭时机 & 方法
你的 WaitingForm
是一个加载窗口,通常在 长时间任务结束后 关闭,常见的关闭方式有 3 种:
✅ 方法 1:任务完成后自动关闭(推荐)
适用于 任务执行完毕后自动关闭 WaitingForm
。
🔹 修改 btnLongTask_Click
代码
private void btnLongTask_Click(object sender, EventArgs e)
{WaitingForm waitingForm = new WaitingForm(this);waitingForm.Show(); // 先显示等待窗口Task.Run(() =>{LongRunningTask(); // 模拟执行长时间任务this.Invoke(new Action(() =>{waitingForm.Close(); // 任务完成后关闭窗口}));});
}
📌 关键点:
waitingForm.Show();
让等待窗口显示Task.Run
异步执行任务,避免阻塞主线程this.Invoke(new Action(() => waitingForm.Close()));
跨线程关闭窗口
✅ 方法 2:按钮手动关闭
适用于 用户可以手动取消等待。
🔹 WaitingForm
添加 取消
按钮
public partial class WaitingForm : Form
{private Button btnCancel;public WaitingForm(Form parentForm){InitializeComponent();this.StartPosition = FormStartPosition.Manual;this.Size = new Size(250, 120);Label lblMessage = new Label();lblMessage.Text = "操作正在进行,请勿操作...";lblMessage.ForeColor = Color.White;lblMessage.AutoSize = true;lblMessage.Font = new Font("Microsoft YaHei", 12, FontStyle.Bold);lblMessage.Location = new Point(30, 30);btnCancel = new Button();btnCancel.Text = "取消";btnCancel.Location = new Point(80, 70);btnCancel.Click += BtnCancel_Click;this.Controls.Add(lblMessage);this.Controls.Add(btnCancel);if (parentForm != null){int x = parentForm.Left + (parentForm.Width - this.Width) / 2;int y = parentForm.Top + (parentForm.Height - this.Height) / 2;this.Location = new Point(x, y);}}private void BtnCancel_Click(object sender, EventArgs e){this.Close(); // 点击取消按钮时关闭窗口}
}
📌 关键点
- 增加一个“取消”按钮
- 用户可以手动点击关闭等待窗口
✅ 方法 3:任务超时自动关闭
适用于 任务执行超时时,自动关闭 WaitingForm
。
🔹 修改 btnLongTask_Click
代码
private void btnLongTask_Click(object sender, EventArgs e)
{WaitingForm waitingForm = new WaitingForm(this);waitingForm.Show();Task.Run(() =>{bool isCompleted = LongRunningTaskWithTimeout(5000); // 5秒超时this.Invoke(new Action(() =>{waitingForm.Close();if (!isCompleted){MessageBox.Show("任务超时,已自动关闭等待窗口!");}}));});
}// 模拟任务:超时返回 false,完成返回 true
private bool LongRunningTaskWithTimeout(int timeout)
{int elapsedTime = 0;while (elapsedTime < timeout){Thread.Sleep(500); // 模拟任务执行elapsedTime += 500;}return elapsedTime < timeout;
}
📌 关键点
- 任务超时(如 5 秒)时自动关闭等待窗口
- 超时后给用户提示
- 任务完成则正常关闭
🔥 小结
关闭方式 | 适用场景 | 关键代码 |
---|---|---|
方法 1:任务完成后自动关闭 (推荐) | 任务完成后自动关闭等待窗口 | waitingForm.Close(); |
方法 2:手动点击关闭 | 用户可以手动取消等待 | btnCancel.Click += BtnCancel_Click; |
方法 3:超时自动关闭 | 任务超时后自动关闭 | if (!isCompleted) { MessageBox.Show("任务超时"); } |
避免阻塞主线程,自动关闭最友好!