C #, механизм позади MessageBox.Show - PullRequest
2 голосов
/ 24 октября 2019

В Visual Studio C # MessageBox.Show остановит, но не заблокирует текущий поток, пока окно сообщения не будет закрыто.

Можно даже поместить его в if statement и дождаться результата.

Чтобы понять механизм, стоящий за ним, я попытался создать один из своих.

Допустим, есть 2 формы: MainForm и MsgForm. MsgForm вызывается из MainForm при нажатии кнопки. Вы можете себе представить, что MsgForm - это моя версия MessageBox.Show.

Ключ предназначен для MainForm до ожидания для MsgForm, пока кнопка в MsgForm не станетщелкнул.

То есть, чтобы сделать его "модальным".

Я мог бы управлять этим, просто позвонив MsgForm.ShowDialog() на MainForm, потому что ShowDialog() сам является модальным.

Но тогда я подумал, а что, если у меня нет этого встроенного механизма !? Как я могу добиться того же самого? Если мне удастся остановить программу с помощью Show(), то мне удастся воссоздать MessageBox.Show.

Сначала я попытался вызвать AutoResetEvent.WaitOne() на MsgForm, все заблокировано! То же самое относится и к концу MainForm.

Но затем я понял, что WaitOne() и MsgForm должны вызываться в "разных потоках", чтобы не блокировать друг друга.

Итак, я вставил следующий код в MainForm:

private void button1_Click(object sender, EventArgs e)
{
    if(Test())
    {
        label1.Text = "Done!";
    }
}

private bool Test()
{
    Thread t = new Thread(doTest);

    t.Start();
    Class1.ARE.WaitOne();    //ARE is a public static AutoResetEvent in Class1 for global usages.
    return true;
}

private void doTest()
{
    MsgForm frm = new MsgForm();

    frm.Show();
}

и просто вызвал Class1.ARE.Set(); в событии нажатия кнопки MsgForm.

Теперь он не только заблокировалвсе это, но также заставляет MsgForm исчезнуть после "вспышки".

Я действительно нахожусь в конце моей веревки здесь!

Может ли кто-нибудь ПОЖАЛУЙСТА быть таким добрым и сказать мнегде я не так сделал??

очень ценится!

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