C# 控件不';不显示是否有繁重的过程

C# 控件不';不显示是否有繁重的过程,c#,winforms,busy-waiting,C#,Winforms,Busy Waiting,我在winform中使用c 在一个非常繁重的函数之前,我想显示一个等待表单来阻止用户。表单将打开,但其中的控件不会绘制 在下面的代码中,waitingForm是一个小表单,只有一个文本框和一个进度条 using (WaitingForm waitingForm = new WaintingForm()) { waitingForm.Show(); HeavyFunction(); } 我只看到两个白色矩形,控件应该出现在其中。为什么会发生这种情况?您不能在繁重的处理之前显示等待表单,并

我在winform中使用c

在一个非常繁重的函数之前,我想显示一个等待表单来阻止用户。表单将打开,但其中的控件不会绘制

在下面的代码中,waitingForm是一个小表单,只有一个文本框和一个进度条

using (WaitingForm waitingForm = new WaintingForm())
{
  waitingForm.Show();
  HeavyFunction();
}

我只看到两个白色矩形,控件应该出现在其中。为什么会发生这种情况?

您不能在繁重的处理之前显示等待表单,并期望UI保持响应。用
HeavyFunction()
阻塞的线程与负责绘制表单、控件和维护UI的线程相同。使用或将繁重的处理卸载到另一个线程


<>编辑:也请考虑Ron Beyer关于

的输入,你需要在UI线程之外做你的重功能……我同意这一点,除了对<代码>后台工作人员< /> >或<代码>线程池> /代码>的建议。这是一个使用异步/等待或任务的好例子。BackgroundWorker实际上被贬低了,除了在特定的情况下,它还可以使用低级线程。@Ron Beyer谢谢,我没有意识到这一点。编辑以包含指向MSDN上异步/等待文章的链接。我希望有一个简单的解决方案,如form.waitForControlDrawed()。我寻找异步/等待解决方案,但这是NET4.5的一个特性。我忘了说我需要以XP SP3为目标,所以我只限于NET4.0。我已经使用backgroundworker了,但这是一个非常简单的工作。我正在寻找ThreadPool,我发现一个NuGet软件包安装了.Net4.0的async/await函数。我正在寻找那些函数。