Windows Form TopMost не работает с BackgroundWorker?

Я пытаюсь показать окно, когда пользователь должен быть уведомлен о какой-либо работе. Все думают, что работают хорошо, но я хочу показать форму абсолютно сверху. Я установил свойство формы TopMost = true, но оно не работает, окно по-прежнему отображается за другими формами.

Я понял, что TopMost = true не работает только с BackgroundWorker, когда я использую класс Timer, он работает нормально. Интересно почему? Кто-нибудь может мне это объяснить?

Вот простой пример того, что я хочу сделать.

    static void Main(string[] args)
    {
        try
        {
            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerAsync();

            Application.Run(new Form());
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp);
        }

    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            System.Threading.Thread.Sleep(1000);

            if (NeedNotify())
            {
                NotifyForm myNotifyForm = new NotifyForm();

                myNotifyForm.TopMost = true;
                myNotifyForm.ShowDialog(); // NotifyForm still show behind others windows
            }
        }
    }

    private static bool NeedNotify()
    {
        return true;
    }
}

1 ответ

Решение

Создание формы в фоновом рабочем режиме приводит к тому, что форма создается в другом потоке. Вместо этого создайте и покажите форму в главном потоке перед вызовом RunWorkerAsync,

Другая проблема может возникнуть из-за того, что вы создаете "уведомление" еще до запуска основного цикла приложения. Вы можете подумать о реорганизации своего кода, чтобы фоновый работник запускался из основной формы. OnLoad событие.

Другие вопросы по тегам