Избавиться от диалогового окна в фоновом режиме - PullRequest
2 голосов
/ 13 октября 2011

Я загружаю экран в backgroundworker:

 private void LSLoadingScreen(object sender, DoWorkEventArgs e)
    {
        LoadingScreen ls = new LoadingScreen(this.timerStart);
        ls.ShowDialog();

        while (LoadingScreen.CancellationPending)
        {
            ls.Dispose();
            LoadingScreen.Dispose();
        }

, но мой загрузочный экран не выдает, когда я использую этот код в другой функции:

LoadingScreen.CancelAsync();
timerStart = false;
LoadingScreen.Dispose();

Как правильно расположить его

1 Ответ

3 голосов
/ 13 октября 2011

Во-первых, ShowDialog () предотвратит выполнение остальной части кода до закрытия диалогового окна, чего вы никогда не делаете.

Даже когда он закроется, он оценит цикл while (который, скорее всего, будет ложным, поэтому пропущен), и тогда ваш фоновый работник будет завершен.

Если все, что вы делаете, это показывает диалоговое окно, то я просто делаю это в главном потоке, и ваш процесс загрузки выполняется в фоновом режиме.

  1. Пожарный фоновый рабочий (который загружает код)
  2. Показать диалог загрузки
  3. В случае события BackgroundWorkerCompleted закройте диалоговое окно загрузки

Попытайтесь получить все свои элементы пользовательского интерфейса в основном потоке пользовательского интерфейса.

Надеюсь, это поможет

EDIT:

На основании вашего комментария ...

public partial class MainForm:Form
{
   LoadingScreen ls;

   public MainForm()
   {
   }

   public void StartLoad()
   {
      ls = new LoadingScreen(this.timerStart);
      backgroundWorker.RunWorkerAsync();
      ls.Show();
   }

   void backgroundWorkerDoWork(object sender, DoWorkEventArgs e)
   {
      //Loading code goes here
   }

   void BackgroundWorkerMainRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   {
      if(ls != null)
         ls.Close();
   }
}
...