.net MessageBox内部喷漆事件高CPU

.net MessageBox内部喷漆事件高CPU,.net,listview,.net,Listview,我有一个自定义的listview,我想调试OnDrawSubItem函数中显示MessageBox的某些内容。我期待一些GUI冻结尝试重新绘制项目。奇怪的是,当我单击子项(在MessageBox之后)时,CPU会100%运行。有人能解释一下这是怎么回事吗 class ListViewEx : ListView { public ListViewEx() { this.SetStyle(ControlStyles.AllPaintingInWmPaint | Con

我有一个自定义的listview,我想调试OnDrawSubItem函数中显示MessageBox的某些内容。我期待一些GUI冻结尝试重新绘制项目。奇怪的是,当我单击子项(在MessageBox之后)时,CPU会100%运行。有人能解释一下这是怎么回事吗

class ListViewEx : ListView
{
    public ListViewEx()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
    }
    protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
    {
        e.DrawDefault = true;
    }
    protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
    {
        MessageBox.Show("test");
        e.DrawDefault = true;
    }
}
编辑

如果我对按钮的绘制事件执行相同的操作,我没有高CPU(只是一些重复的消息框)

我知道在绘画活动中展示mbox是不对的。我对我的两个例子中的不同行为感到好奇

正如建议的那样,在处理UI代码时,不应使用消息框作为调试辅助工具。它们会导致各种各样的问题,并掩盖您试图调试的行为

更好的解决方案包括以下一项或多项:

  • 战略地点的断点
  • 检验假设
  • 将诊断打印到输出/即时窗口

出于兴趣:它会导致什么问题?(亚历克斯说了一个,我想不是很常见的一个)@vines除此之外,它还改变了许多其他行为。例如,如果正在处理与焦点相关的事件,则显示和取消显示消息框会多次更改焦点。有几个控件不喜欢在事件处理程序中将焦点从它们身上抽离;TreeView就是一个很好的例子。
    private void btnTest_Paint(object sender, PaintEventArgs e)
    {
        MessageBox.Show("test");
    }