Заметка о создании диалога загрузки или диалога ожидания в WinForms на языке C#. Довольно часто нужно отобразить ход выполнения какой либо части программы. К примеру, мы скачиваем данные из «этих ваших интырнетов» или формируем отчет. Давайте покажем пользователю ход выполнения, погнали.

Создаем новую форму в вашем проекте и называем ее frmWaitForm. Далее переносим на нее следующие элементы управления: Label и ProgressBar. В итоге внешний вид формы будет примерно таким:

Создание новой формы

Эта форма нам нужна только для отображения прогресса выполнения. поэтому никаких кнопок мы на ней ней размещаем.

Теперь нам понадобится новая форма, назовем ее Form1, на нее мы размещаем ListView и Button (кнопку). Эти контролы нам будут нужны для демонстрации примера. Форма будет выглядеть следующим образом.

Создадим свойство Worker для обработки загрузчика в для frmWaiForm.

public Action Worker { get; set; }

Action это делегат, очень похож на Func, но в отличии от Func Action не возвращает никаких значений. Другими словами, делегат Action может использоваться с методом, который имеет возвращаемый тип void.

Добавление параметра worker в конструктор frmWaitForm позволяет инициализировать свойство Worker в виде следующего кода на c #:

public frmWaitForm(Action worker)
{
    InitializeComponent();
    if (worker == null)
        throw new ArgumentNullException();
    Worker = worker;
}

И не забудьте переопределить метод OnLoad, позволяющий запустить новый поток при закрытии формы.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    //Начинаем новый поток
    Task.Factory.StartNew(Worker).ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
}

Наконец, откройте форму Form1, затем создайте метод SaveData. Это метод симуляции хранения данных, вы можете использовать метод Thread.Sleep, чтобы задержать цикл.

void SaveData()
{
    //Добавляем код для манипуляции с данными
    for (int i = 0; i <= 500; i++)
        Thread.Sleep(10); //Симуляция
}

И добавим обработчик на событие нажатие кнопки чтобы отобразить форму ожидания загрузки.

private void button1_Click(object sender, EventArgs e)
{
    //Открываем форму с ожиданием загрузки
    using (frmWaitForm frm = new frmWaitForm(SaveData))
    {
        frm.ShowDialog(this);
    }
}

Вот что в итоге у нас получилось.