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
событие.