Внимание: этот пост содержит элементы саморекламы; o)
Я бы, вероятно, использовал форму всплеска в этом случае. Некоторое время назад я написал сообщение в блоге (вызванное этим SO Q & A ) о поточно-ориентированной всплывающей форме, которая может использоваться вместе, и будет долго выполняться инициализация основной формы.
Короче говоря, подход заключается в использовании ShowDialog, но для создания и отображения формы в отдельном потоке, чтобы он не блокировал основной поток. Форма содержит метку сообщения о состоянии (конечно, она может быть расширена и с помощью индикатора выполнения). Кроме того, существует статический класс, который предоставляет поточно-ориентированные методы для отображения, обновления и закрытия всплывающей формы.
Примеры сжатого кода (для примеров с комментариями, проверьте сообщение в блоге):
using System;
using System.Windows.Forms;
public interface ISplashForm
{
IAsyncResult BeginInvoke(Delegate method);
DialogResult ShowDialog();
void Close();
void SetStatusText(string text);
}
using System.Windows.Forms;
public partial class SplashForm : Form, ISplashForm
{
public SplashForm()
{
InitializeComponent();
}
public void SetStatusText(string text)
{
_statusText.Text = text;
}
}
using System;
using System.Windows.Forms;
using System.Threading;
public static class SplashUtility<T> where T : ISplashForm
{
private static T _splash = default(T);
public static void Show()
{
ThreadPool.QueueUserWorkItem((WaitCallback)delegate
{
_splash = Activator.CreateInstance<T>();
_splash.ShowDialog();
});
}
public static void Close()
{
if (_splash != null)
{
_splash.BeginInvoke((MethodInvoker)delegate { _splash.Close(); });
}
}
public static void SetStatusText(string text)
{
if (_splash != null)
{
_splash.BeginInvoke((MethodInvoker)delegate { _splash.SetStatusText(text); });
}
}
}
Пример использования:
SplashUtility<SplashForm>.Show();
SplashUtility<SplashForm>.SetStatusText("Working really hard...");
SplashUtility<SplashForm>.Close();