Приложение Winforms зависает при переключении на другое приложение - PullRequest
0 голосов
/ 12 марта 2010

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

    private void btnVerify_Click(object sender, EventArgs e)
    {
        if (!backgroundWorkerVerify.IsBusy)
        {
            backgroundWorkerVerify.RunWorkerAsync();
        }
    }

  private void backgroundWorkerVerify_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        VerifyAppointments();
    }

  private void backgroundWorkerVerify_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {

        MessageBox.Show("Information was Verified.", "Verify",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
        CloseEvent();
    }

ванильный код. но проблема, с которой я сталкиваюсь, заключается в том, что, когда приложение работает и пользователи переходят на другое приложение, когда они возвращаются ко мне, приложение зависает, у них появляется пустой экран, и они должны его убить. Это началось, когда я положил код потоков. Могу ли я иметь какие-то мошеннические темы там? Каков наилучший способ обнулить в потоке проблемы? Проблема не может быть воссоздана на моей машине ... Я знаю, что я что-то упускаю из-за того, как правильно избавиться от фонового работника. Любые мысли приветствуются, спасибо,

Jose

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Ваш фрагмент кода не объясняет этого, но блокировка потока пользовательского интерфейса никогда не бывает такой сложной, когда вы используете BGW и заинтересованы в его свойстве IsBusy. Подобный тупик обычно легко диагностировать, используйте Debug + Break All. Затем Отладка + Windows + Потоки и дважды щелкните по Основному потоку. Затем Debug + Windows + Call Stack, чтобы увидеть, что делает поток пользовательского интерфейса.

Распространенным сценарием является то, что поток пользовательского интерфейса зацикливается на свойстве IsBusy. BGW не может завершиться, потому что его событие RunWorkerCompleted не может быть запущено, пока поток пользовательского интерфейса не будет свободен.

0 голосов
/ 12 марта 2010

Вы обращаетесь к GUI из метода VerifyAppointments()? Вы должны использовать DoWorkEventArgs для передачи проверяемых аргументов, и вам не следует обращаться к GUI напрямую из BackgroundWorker.

Вы можете безопасно обращаться к GUI только в событиях RunWorkerCompleted или ProgressChanged.

...