У меня есть приложение, выполнение некоторых обновлений графического интерфейса которого может занять много времени. Я не могу запустить это в фоновом потоке, потому что долгая обработка связана с обновлением компонентов графического интерфейса, которое можно выполнить только в основном потоке.
Поэтому я создал вспомогательный класс, который будет создавать и отображать форму WaitDialog в фоновом потоке, пока графический интерфейс не завершит обновление.
Мой вспомогательный класс выглядит так:
public class ProgressWaitDialogHelper : IDisposable
{
private Thread _thread = null;
public void ShowDialog()
{
ThreadStart threadStart = new ThreadStart(ShowDialogAsync);
_thread = new Thread(threadStart);
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public void Dispose()
{
if ((_thread != null) &&
(_thread.IsAlive))
{
_thread.Abort();
}
}
private void ShowDialogAsync()
{
ProgressWaitDialog waitDialog = new ProgressWaitDialog();
waitDialog.ShowDialog();
}
}
Код для вызова вспомогательного класса в моем главном окне графического интерфейса выглядит следующим образом:
using (ProgressWaitDialogHelper waitDialog = new ProgressWaitDialogHelper())
{
waitDialog.ShowDialog();
// Do long running GUI task on main thread here.
}
Кажется, это работает нормально и выглядит именно так, как я хочу в графическом интерфейсе. Форма WaitDialog является модальной и блокирует доступ к основной форме графического интерфейса до тех пор, пока она не закончит свои обновления. Как только длительная задача графического интерфейса будет завершена, она выпадет из блока Using и, таким образом, вызовет метод Dispose в вспомогательном классе, который, в свою очередь, вызовет Abort в потоке.
Мой вопрос: есть ли более изящный способ завершить поток или лучший способ добиться того же поведения?