我设计的目标是运行方法。
它是please wait
形式。
我给了一位代表,并致电ShowDialog
。
它只需要该委托并在Shown
事件中执行它。之后,Hide()
。
目的只是告诉用户等到代表运行。
但是:它在完全显示之前开始执行代理。我的意思是,表单出现在屏幕上,但please wait
标签被正在运行的代码卡住,显示得很晚,甚至没有显示。 (一个空的矩形保留在表格的中间)。
我可以在运行委托之前让表单等待两秒钟,但是在表单完全绘制之后是否有另一种方式(更好,更放心)调用委托,标签显示???
感谢。
答案 0 :(得分:1)
尝试使用BackgroundWorker BackgroundWorker组件有4个事件。
您需要实现其中两个:DoWork和RunWorkerCompleted
DoWork方法在一个线程中执行,并且是您工作的地方(或者在您的情况下,调用您的委托) 工作完成后调用RunWorkerCompleted,您可以在那里调用Hide()方法。
如果你碰巧想要显示进度,你可以实现ProgressChanged事件,它允许你传递一个完成的百分比和一个对象(通常我传递一个关于我正在做的事情的消息)
然后像往常一样做你的绘图,并调用后台工作者RunWorkerAsync来调用它。
public class Wait : Form
{
BackgroundWorker _bgWorker = new BackgroundWorker();
public delegate void toExecuteDele(object args);
public toExecuteDele ToExecute;
public Wait()
{
InitializeComponent();
_bgWorker.DoWork += new DoWorkEventHandler( DoWork )
_bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (WorkDone);
}
public void Execute(object args)
{
// Display Stuff (label, start a progress bar pulsing, maybe enable disable stuff
DispalyStuff(" Plate Wait");
_bgWorker.RunBackgroundAsync(args);
}
private void DoWork(object sender, DoWorkEventArgs e)
{
if( ToExecute != null )
ToExecute(e.Argument);
}
public void WorkDone(object sender, RunWorkerCompletedEventArgs e)
{
// Display an Error if there is an exception in the event args
Hide();
}
}
DoWork中的所有内容都发生在另一个线程中,其他所有内容都在UI线程中运行,并且在执行时不会挂断。