понедельник, 3 октября 2011 г.

Класс BackgroundWorker и заставка при загрузке

Уже довольно продолжительное время допиливаю небольшую самописную корпоративную систему. И вот решил на время загрузки приложения (порядка 4 сек) вывести заставочку с логотипом компании.



Создал форму frmLogon, куда запихал картинку с логотипом и в коде главной формы создал переменную
frmLogon f;
* This source code was highlighted with Source Code Highlighter.
На главную форму закинул компонент  BackgroundWorker и добавил обработчик события DoWork.

    private void bgwBackWorker_DoWork(object sender, DoWorkEventArgs e)
    {

      f = new frmLogon();
      //Используется ShowDialog - потому что если использовать просто метод Show(), форма у меня появлялась и тут же пропадала.
      f.ShowDialog();
    }

* This source code was highlighted with Source Code Highlighter.
Теперь в конструктор главной формы я добавил следующее:

      this.Hide();
     
bgwBackWorker.RunWorkerAsync();

      //долгий код, выполнение которого я хотел спрятать

      bgwBackWorker.Dispose();
      this.Show();

* This source code was highlighted with Source Code Highlighter.
Небольшая ремарка: у класса BackgroundWorker есть метод CancelAsync, который выставляет  свойство CancellationPending равным true. Это свойcтво как раз указывает, был ли отправлен запрос на прекращение работы треда. Нам эта дорога не подходит, почему - описано здесь.

Итак, тред мы убили, теперь надо спрятать форму заставки. Просто так ее убить мы не можем, потому что она создана в другом потоке. Поэтому делаем так: создаем делегат и с его помощью вызываем метод из другого потока.

      public delegate void LogonHideDelegate();

      //В конец конструктора формы добавляем:

      ...
      f.Invoke(new
LogonHideDelegate (f.Dispose));

* This source code was highlighted with Source Code Highlighter.
Вот и все.

Комментариев нет:

Отправить комментарий