В 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
исчезнуть после "вспышки".
Я действительно нахожусь в конце моей веревки здесь!
Может ли кто-нибудь ПОЖАЛУЙСТА быть таким добрым и сказать мнегде я не так сделал??
очень ценится!