Кратчайший код для порождения модального диалогового окна из потока - PullRequest
1 голос
/ 30 декабря 2008

Скажем, у меня есть поток, который продолжает работать в фоновом режиме, чтобы выяснить, доступен ли URL. Если URL недоступен, приложение должно показать модальное диалоговое окно. Вещи не могут продолжаться, если URL не работает. Если я просто сделаю MessageBox.show из потока, это окно сообщения не будет модальным. ShowDialog также не будет работать.

Ответы [ 4 ]

4 голосов
/ 30 декабря 2008

Вы можете использовать Control.Invoke (или this.Invoke)

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
      this.Invoke(new MessageBoxDelegate(ShowMessage), "Title", "MEssage", MessageBoxButtons.OK, MessageBoxIcon.Information);    }

Это сделает его модальным для потока пользовательского интерфейса.

2 голосов
/ 30 декабря 2008

Спасибо всем. Я решил проблему следующим образом:

Тема:

private Thread tCheckURL;

// ...

tCheckURL = new Thread(delegate()
{
    while (true)
    {
        if (CheckUrl("http://www.yahoo.com") == false)
        {
            form1.Invoke(form1.myDelegate);
        }
    }
});
tCheckURL.Start();

Внутри формы1:

public delegate void AddListItem();
public AddListItem myDelegate;

Form1()
{
    //...
    myDelegate = new AddListItem(ShowURLError);
}
public void ShowURLError()
{
    MessageBox.Show("The site is down");
}

Не уверен, что это самый короткий способ сделать это ... но он выполняет свою работу.

2 голосов
/ 30 декабря 2008

Вы можете попробовать создать событие, которое запускается из фонового потока. Пусть основная форма прослушивает событие, в этом случае оно запускает окно сообщения в модальной форме. Хотя мне больше нравится подход, предложенный ocdecio.

1 голос
/ 30 декабря 2008
public class FooForm : Form {

    public static void Main() {
        Application.Run(new FooForm());
    }

    public FooForm() {
        new Thread(new Action(delegate {
            Invoke(new Action(delegate {
                MessageBox.Show("FooMessage");
            }));
        })).Start();
    }

}

Эта программа создает окно формы и сразу же создает другой поток без графического интерфейса, который хочет вызвать модальное диалоговое окно в графическом потоке формы. Метод Invoke формы принимает делегата и вызывает его в потоке графического интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...