1

我设计了一个唯一的目标是运行一个方法。它是一种please wait形式。

我给它一个代表,然后打电话给ShowDialog. 它只接受该委托并在Shown事件中执行它。之后,Hide().

目的只是在那里告诉用户等到委托运行。

但是:它在完全显示之前开始执行委托。我的意思是,表单出现在屏幕上,但please wait标签被正在运行的代码卡住,显示得很晚,甚至没有显示。(一个空的矩形保留在表格的中间)。

我可以让表单在运行代表之前等待大约两秒钟,但是在表单完全绘制并显示标签之后是否有另一种方式(更好和更可靠)来调用代表?

谢谢。

4

1 回答 1

1

尝试使用BackgroundWorker BackgroundWorker 组件有 4 个事件。

您需要实现其中 2 个: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 线程中运行,并且在执行时不会挂起。

于 2013-05-10T19:41:59.210 回答