2

我想在我的主窗体执行冗长的任务时显示一个“请稍候”消息框。至于我的情况,冗长的任务是传输串行协议。下面是我的代码:

public void transmitprotocol()
{    
    try
    {
         MessageBox.Show("Please wait. Uploading logo.", "Status");

         // Transmitting protocol coding here. Takes around 2 minutes to finish.

    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}

我已经尝试过使用 MessageBox 的上述方法,就像上面的编码一样,但我总是必须关闭 MessageBox 只有它才会开始传输协议。有什么方法可以在传输协议时仍然显示“请稍候”消息框吗?

4

3 回答 3

9

您将需要在后台线程上执行昂贵的操作。为此,请使用BackgroundWorker或新的并行化库(.NET 4 等)。

实际上,您需要关闭对话框,因为它会阻止执行,直到您关闭它。您所做的是开始操作,然后显示对话框,然后在操作完成后关闭对话框。

现在,如果您使用的是 WPF,我强烈建议您不要使用 Dialog Box 而是使用Busy Indicator,它是免费的、非常易于使用且不像 Message Box 那样难看。

编辑:既然您指定您正在使用 WinForms,那么继续,实现背景工作,为什么不实现一个没有 chrome 的透明窗口,其目的是显示一个忙碌的标签。后台工作人员结束后,您关闭该窗口。

在此处输入图像描述

于 2012-09-20T03:39:47.910 回答
6

您必须准备一个后台工作人员并使用 Windows 窗体而不是 MessageBox。像这样简单的复制/粘贴:

    Form1 msgForm;
    public void transmitprotocol()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        //you can use progresschange in order change waiting message while background working
        msgForm = new Form1();//set lable and your waiting text in this form
        try
        {
            bw.RunWorkerAsync();//this will run all Transmitting protocol coding at background thread

            //MessageBox.Show("Please wait. Uploading logo.", "Status");
            msgForm.ShowDialog();//use controlable form instead of poor MessageBox
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // Transmitting protocol coding here. Takes around 2 minutes to finish. 
        //you have to write down your Transmitting codes here
        ...

        //The following code is just for loading time simulation and you can remove it later. 
        System.Threading.Thread.Sleep(5*1000); //this code take 5 seconds to be passed
    }
    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //all background work has complete and we are going to close the waiting message
        msgForm.Close();
    }
于 2012-09-20T05:36:11.913 回答
0

最简单的方法是使用 show() 打开启动画面 打开所需的表单并在构造函数中传递一个启动画面的实例:

        Wait myWaitDialog = new Wait(); //Wait is your splash
        myWaitDialog.Show();
        myWaitDialog.Refresh(); //Otherwise screen fails to refresh splash
        ScheduleClassForm myForm = new ScheduleClassForm(myWaitDialog);
        myForm.TopLevel = true;
        myForm.ShowDialog();

将此代码添加到生成的表单构造函数中:

    public ScheduleClassForm(Form WaitWindow)
    {            
       InitializeComponent();
       WaitWindow.Close();
    }

对我来说,它在 form_load 中失败,但在构造函数中工作。在关闭WaitWindow 之前确保您的工作已经完成(例如数据库加载)。

于 2016-07-06T18:06:04.353 回答