В приложении winforms, как вы можете запустить окно сообщения от фонового работника, который всегда должен быть на переднем плане? - PullRequest
7 голосов
/ 20 июля 2011

Прямо сейчас я использую фоновый рабочий поток для частой проверки чего-либо, и если выполняются условия, генерируется окно сообщения.

Некоторое время я не замечал, что из-за того, что я вызываю ящик сообщений в фоновом режиме, я теряю обычное поведение ящика сообщений, не позволяющее пользователю щелкнуть обратно в главной форме, прежде чем он нажмет Да / Нет / Отмена в окне сообщений. .

Итак, есть ли какая-то опция в окне сообщений, чтобы всегда держать ее на переднем плане? Или можно отправить сообщение из фонового рабочего в основную форму, чтобы я мог сгенерировать оттуда ящик сообщений? Есть ли другой способ?

Спасибо

Isaac

Ответы [ 2 ]

9 голосов
/ 20 июля 2011

Фоновый рабочий - это другая нить, чем ваша форма Windows.Поэтому вы должны позволить своему фоновому работнику как-то вернуть информацию обратно в основной поток.В приведенном ниже примере я использую функцию reportProgress фонового работника, так как событие запускается в потоке формы Windows.

public partial class Form1 : Form
{
    enum states
    {
        Message1,
        Message2
    }
    BackgroundWorker worker;

    public Form1()
    {
        InitializeComponent();
        worker = new BackgroundWorker();
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        //Fake some work, report progress
        worker.ReportProgress(0, states.Message1);
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        states state = (states)e.UserState;
        if (state == states.Message1) MessageBox.Show("This should hold the form");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        worker.RunWorkerAsync();
    }

}

Примечание: фоновый работник НЕ останавливается на reportProgressЕсли вы хотите, чтобы ваш bgworker ждал, пока не будет нажата кнопка mbox, вам нужно что-то вручную остановить для этого.

2 голосов
/ 20 июля 2011

Вы можете использовать метод Invoke класса Form1 для вызова потока пользовательского интерфейса этой формы.

this.Invoke(() => MessageBox.Show("Hi"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...