c# - C#,MessageBox.Show 背后的机制
问题描述
在 Visual Studio C# 中,MessageBox.Show
将暂停但不锁定当前线程,直到消息窗口关闭。
甚至可以将其放入if statement
并等待结果。
为了了解其背后的机制,我尝试自己制作一个。
假设有 2 种形式,MainForm
并且MsgForm
. 从单击按钮时MsgForm
调用。MainForm
你可以想象这MsgForm
是我的版本MessageBox.Show
。
关键是等待MainForm
直到单击MsgForm
按钮MsgForm
。
也就是说,使其成为“模态”。
我可以简单地通过调用来管理它MsgForm.ShowDialog()
,MainForm
因为ShowDialog()
它本身是模态的。
但后来我想,如果我没有那个内置机制怎么办!?我怎么能做到同样的事情!?
由于Show()
不是模态的,所以我认为使用它进行测试很好。如果我设法用 停止程序Show()
,那么我成功地重新创建了MessageBox.Show
.
我第一次尝试调用AutoResetEvent.WaitOne()
,MsgForm
它锁定了整个事情!结束时也是如此MainForm
。
但后来我意识到必须在“不同的线程”上调用WaitOne()
andMsgForm
才能不相互锁定。
所以我将以下代码放入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
“闪光”后消失了。
我真的走到了尽头!
有人可以这么好心告诉我我哪里做错了吗!?
非常感激!
解决方案
推荐阅读
- python - pd.Series.to_list() 改变 dtype
- python - 无法使用 matplotlib 将颜色条添加到画布上的热图
- c++ - 订阅者上的 ZMQ recv 不遵守设置超时
- neo4j - Cypher 查询统计每个节点具有的特定类型关系的数量,包括其子节点中的相同类型关系
- javascript - 创建一个列表(
- ) 然后移除元素
- google-bigquery - 在bigquery中转换多对多对一对多的关系
- reactjs - 打字稿选择错误的类型
- c# - 使用 API 在创建项目时设置属性
- python - 如何在pygame中制作一个缩小的黑盒
- php - 如何让“添加到购物车按钮”出现在我放置的位置