如何创建异步控件包装器?

时间:2011-08-11 16:16:32

标签: .net winforms multithreading asynchronous

我需要能够在Windows窗体中轻松创建异步UI。我正在考虑创建自定义容器控件,允许在那里托管其他控件。然后,在运行应用程序时,除非填充/初始化其他控件,否则此控件将显示进度条。然后,完成工作后,将显示这些控件并隐藏进度条。

有任何建议如何实现这个?

1 个答案:

答案 0 :(得分:2)

您可以使用Panel类作为起点。只是继承它。

您需要在面板顶部或作为其第一个成员加载进度条。如果您不想更新它,可以在进度条上使用Marquee样式;否则,您可以在向面板添加控件时增加进度条。

如果您使用Marquee样式,那么您已经完成了很多工作。如果你想要一个实际的进度条从0到100%填满,你将需要一些额外的幻想。

这是一个棘手的部分:UI组件更新必须在UI线程中运行。但是你无法在UI线程中运行所有内容,因为在完成添加控件之前,UI线程不会处理事件(例如更新进度条)。

您需要的是一种方法,该方法将负责将控件添加到Panel,以便您可以在发生时更新UI。有很多方法可以做到这一点;最简单的方法可以说是:

Thread thread = new Thread(MyControlAddingMethod);
thread.Start();

您的控件添加方法需要将UI方法调用封送到UI线程。方法如下:

void MyControlAddingMethod()
{
   myPanel.BeginInvoke(m => { myPanel.Controls.Add(myControl); ++myProgressBar.Value;});
   //or
   myPanel.BeginInvoke(MyFunctionThatDoesTheSameAsTheLambdaStatementAbove);
}