Уже довольно продолжительное время допиливаю небольшую самописную корпоративную систему. И вот решил на время загрузки приложения (порядка 4 сек) вывести заставочку с логотипом компании.
Создал форму frmLogon, куда запихал картинку с логотипом и в коде главной формы создал переменную
Итак, тред мы убили, теперь надо спрятать форму заставки. Просто так ее убить мы не можем, потому что она создана в другом потоке. Поэтому делаем так: создаем делегат и с его помощью вызываем метод из другого потока.
Создал форму 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.
Теперь в конструктор главной формы я добавил следующее:Небольшая ремарка: у класса BackgroundWorker есть метод CancelAsync, который выставляет свойство CancellationPending равным true. Это свойcтво как раз указывает, был ли отправлен запрос на прекращение работы треда. Нам эта дорога не подходит, почему - описано здесь.this.Hide();
bgwBackWorker.RunWorkerAsync();
//долгий код, выполнение которого я хотел спрятать
bgwBackWorker.Dispose();
this.Show();
* This source code was highlighted with Source Code Highlighter.
Итак, тред мы убили, теперь надо спрятать форму заставки. Просто так ее убить мы не можем, потому что она создана в другом потоке. Поэтому делаем так: создаем делегат и с его помощью вызываем метод из другого потока.
Вот и все.public delegate void LogonHideDelegate();
//В конец конструктора формы добавляем:
...
f.Invoke(newLogonHideDelegate
(f.Dispose));
* This source code was highlighted with Source Code Highlighter.
Комментариев нет:
Отправить комментарий