我希望在主要表单执行冗长的任务时显示“请稍候”消息框。至于我的情况,冗长的任务是传输串行协议。以下是我的代码:
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才会开始传输协议。 我有什么方法可以在传输协议时仍然显示“请等待”MessageBox吗?
答案 0 :(得分:9)
您需要在后台线程上执行昂贵的操作。为此,使用BackgroundWorker或新的并行化库(.NET 4等)。
实际上你需要关闭对话框,因为它会阻止执行,直到你关闭它为止。你所做的是你开始操作,然后显示对话框,然后,一旦操作完成,你关闭对话框。
现在,如果您正在使用WPF,我强烈建议您不要使用对话框,而是使用Busy Indicator,它是免费的,非常易于使用,并且不像消息框那么难看。
编辑:既然你指定你正在使用WinForms,那么继续,实现背景工作,为什么不,一个没有chrome的透明窗口,其目的是显示忙碌标签。一旦后台工作人员结束,你关闭那个窗口。
答案 1 :(得分:4)
您必须准备一个后台工作者并使用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();
}
答案 2 :(得分:0)
最简单的方法是使用show()打开启动画面 打开所需的表单并在构造函数中传递一个splash表单实例:
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之前,请确保您的工作已完成(例如数据库加载)。