C# 列表框在隐藏时未完全消失

C# 列表框在隐藏时未完全消失,c#,forms,C#,Forms,我有一个简单的方法可以做到这一点: private void searchButton_Click(object sender, EventArgs e) { searchResultsBox.Hide(); doSomething(); } searchResultsBox是一个列表框,当我调用它的隐藏方法时,它实际上不会完全消失,直到“doSomething”完成处理。它会留下一些瑕疵(事实上,你仍然可以看到盒子的任何部分后面有一个空的表单表

我有一个简单的方法可以做到这一点:

private void searchButton_Click(object sender, EventArgs e)
    {
        searchResultsBox.Hide();
        doSomething();
    }
searchResultsBox是一个列表框,当我调用它的隐藏方法时,它实际上不会完全消失,直到“doSomething”完成处理。它会留下一些瑕疵(事实上,你仍然可以看到盒子的任何部分后面有一个空的表单表面)

如果我把“doSomething”注释掉,它会很快消失


关于如何解决这个问题有什么想法吗?只是有点难看。

听起来doSomething是进程密集型的,并且阻塞了GUI线程,不确定为什么它在执行doSomething之前不完成隐藏列表


我会尝试将doSomething放在一个单独的线程中。

听起来doSomething是进程密集型的,并且阻塞了GUI线程,不确定为什么它不能在执行doSomething之前完成隐藏列表


我会尝试将doSomething放入一个单独的线程。

您可以在调用searchResultsBox.Hide()之后尝试调用this.refresh();

您可以在调用searchResultsBox.Hide()之后尝试调用this.refresh();

单独的线程或后台工作进程是最好的答案。您还可以尝试调用Application.DoEvents()。虽然我不赞成经常使用该调用,但对于这个特定问题,这似乎有时是有效的。

单独的线程或后台工作进程是最好的答案。您也可以尝试调用Application.DoEvents()。虽然我不赞成经常使用该调用,但这似乎有时对这个特定问题有效。

您不应该在GUI事件线程中执行重要的工作,因为这会导致UI在忙于运行事件处理代码时冻结。在另一个线程中执行任何长时间运行的任务都是一种很好的做法,无论是通过signalin还是通过signaling另一个已经运行的线程来完成工作,或者在现场启动一个新线程

new Thread(new ThreadStart(doSomething)).Start();

您不应该在GUI事件线程中执行重要的工作,因为这会导致UI在忙于运行事件处理代码时冻结。在另一个线程中执行任何长时间运行的任务是一个很好的做法,可以通过向另一个已在运行的线程发送信号来执行该工作,也可以通过在现场启动一个新线程

new Thread(new ThreadStart(doSomething)).Start();

答对了。我在表单对象上找不到刷新方法,所以我放弃了查找。谢谢。没问题,正如下面的人指出的那样-刷新对于修复GUI线程中的快速暂停非常有用,但是如果doSomething()可能要花很多时间,把它放到一个单独的线程中。宾果。我在表单对象上找不到刷新方法,所以我放弃了查找。谢谢。没问题,正如下面的人所指出的那样-刷新对于修复GUI线程中的快速暂停非常有用,但是如果doSomething()可能需要很多时间,把它放到一个单独的线程中。doSomething只需要一秒钟左右的时间就可以运行,但是它更新了GUI控件,所以它不能在另一个线程中运行。遗憾的是,你是对的,这是一种奇怪的行为。你可以在另一个线程中运行它,这样就不需要更新控件了……或者,如果你的意思是,更改它们,然后可以使用Invoke()将控件传递回GUI线程以更改内容。doSomething只需一秒钟左右的时间即可运行,但它会更新GUI控件,使其不能位于另一个线程中。遗憾的是,你是对的,这是一种奇怪的行为。你可以在另一个线程中运行它,从而消除更新控件的需要……或者,如果你的意思是更改控件,那么你可以se Invoke()将控制权传递回GUI线程以进行更改。同意,但只要50毫秒的等待时间,即可检测到该行为。同意,但只要50毫秒的等待时间,即可检测到该行为。