Другой вариант - использовать асинхронный делегат для отображения формы в потоке потоков.
Потоки в пуле потоков рекомендуются для потоков с более коротким сроком службы, которые не сохраняются в течение всей продолжительности приложения. Так как это отображает недолгое, пожалуйста, подождите окно, пул потоков является разумным выбором.
Делегат Action (.NET 2.0+) используется вместе с методом BeginInvoke () для автоматического запуска кода делегата в потоке потоков.
Некоторые заметки:
- Важно использовать Control.
- Кроме того,
m_pleaseWaitForm.ShowDialog();
фактически запускает новый цикл сообщений в новом потоке. Это то, что поддерживает форму «Пожалуйста, подождите».
- Поскольку используется поток пула потоков, этот поток автоматически становится фоновым потоком и будет прерван, если основное приложение будет закрыто.
- Помимо запуска в другом потоке, в Form2 нет ничего особенного. Вы можете разместить на нем любые дочерние элементы управления, такие как Pictureboxes, ярлыки и т. Д.
(MethodInvoker)delegate { ... }
- это просто способ запуска кода в .NET 2.0 во встроенном делегате.
Пример, приведенный ниже, можно добавить в проект WinForms, содержащий Form1: основная форма и Form2: форма подождите.
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(); });
}