Một tùy chọn khác là sử dụng một đại biểu không đồng bộ để hiển thị biểu mẫu trên chuỗi threadpool.
Chủ đề trong threadpool được đề nghị cho các chủ đề sống ngắn hơn không kéo dài trong toàn bộ thời gian đăng ký. Vì đây là để hiển thị một thời gian ngắn xin vui lòng chờ đợi cửa sổ, các threadpool là một sự lựa chọn hợp lý.
Hành động ủy nhiệm (.NET 2.0+) được sử dụng cùng với phương thức BeginInvoke() của nó để tự động chạy mã đại biểu trên một luồng threadpool.
Một số lưu ý:
- Điều quan trọng là sử dụng Control.BeginInvoke cho bất kỳ chủ đề cuộc gọi GUI chéo, chẳng hạn như đóng cửa các hình thức vui lòng đợi trong ClosePleaseWait().
- Ngoài ra,
m_pleaseWaitForm.ShowDialog();
thực sự bắt đầu một vòng lặp tin nhắn mới trong chuỗi mới. Đây là những gì giữ cho hình thức chờ đợi vui vẻ.
- Bởi vì một thread threadpool được sử dụng, chủ đề này sẽ tự động là một chủ đề nền và sẽ bị chấm dứt nếu ứng dụng chính được đóng lại.
- Ngoài việc chạy trên một chuỗi khác, không có gì đặc biệt về Form2. Bạn có thể đặt bất kỳ điều khiển con nào như Pictureboxes, nhãn vv trên đó.
(MethodInvoker)delegate { ... }
chỉ là cách chạy .NET 2.0 trong nội dòng đại biểu.
Ví dụ dưới đây có thể được thêm vào dự án WinForms có chứa Form1: biểu mẫu chính và Biểu mẫu 2: biểu mẫu xin vui lòng chờ.
private Form2 m_pleaseWaitForm = null;
private void Form1_Shown(object sender, EventArgs e)
{
// This code could also be placed in eg. a button click event handler.
Action<Rectangle> a = new Action<Rectangle>(ShowPleaseWait);
a.BeginInvoke(this.Bounds, null, null);
// Do your long running tasks
ClosePleaseWait();
}
private void ShowPleaseWait(Rectangle bounds)
{
// This method runs on the new thread.
m_pleaseWaitForm = new Form2();
m_pleaseWaitForm.TopMost = true;
m_pleaseWaitForm.Location = new Point(bounds.Left + bounds.Width/2 - m_pleaseWaitForm.Width/2, bounds.Top + bounds.Height/2 - m_pleaseWaitForm.Height/2);
m_pleaseWaitForm.ShowDialog();
}
private void ClosePleaseWait()
{
m_pleaseWaitForm.BeginInvoke((MethodInvoker)delegate { m_pleaseWaitForm.Close(); });
}
Đây có phải là thực sự web hình thức, hoặc là winforms này? Bạn đang nói về Excel và VSTO. và nếu đó là biểu mẫu web, bạn không có phương thức làm mới. –
Xin lỗi, vâng, Winforms, không phải Webforms .. Đã chỉnh sửa câu hỏi ... Đã là một ngày dài ... –
Bất kỳ giải pháp cuối cùng nào có mẫu mã nguồn đầy đủ? Điều gì về việc sử dụng quá trình chạy dài với các bước sử dụng C#, SignalR? – Kiquenet