我的应用程序加载时我使用下面的代码显示进度条。问题是如果有人点击工具栏上下文菜单(退出的方式),它将被阻止,直到进度条关闭为止。有谁知道更好的方法来实现这一目标?
我使用ShowDialog
的原因是,当我使用Show
时,进度条不会动画 - 我正在使用MarqueeStyle。
由于
public partial class PopUpProgessBar : Form
{
public PopUpProgessBar()
{
InitializeComponent();
}
Thread t;
private void StartAnmiation()
{
this.Update();
this.ShowDialog();
}
public void Stop()
{
if (t != null)
{
t.Abort();
t.Join();
}
}
public void Start()
{
if (t == null)
{
t = new Thread(new ThreadStart(this.StartAnmiation));
t.Start();
}
}
答案 0 :(得分:2)
此代码看起来不太正确。你确定它不会引发跨线程违规吗?一般来说,你的整个比喻都是错误的。您需要在GUI线程上保留GUI。在后台线程上加载您的应用程序,并让它将进度更新发送到GUI线程。
答案 1 :(得分:1)
您的PopupProgressBar表单不应该负责在新线程中加载自己,这应该在您的主窗口中完成。
我会摆脱PopupProgressBar中的所有线程,并让它只是开始更新它的选框。然后,在你的主窗口(OnLoad)中,你告诉它做的事情:
bool done = false;
PopupProgressBar splashForm = null;
ThreadPool.QueueUserWorkItem((x) =>
{
using (splashForm = new PopupProgressBar ())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
});
// do all your initialization work here
// also, during each step of your initialization you could send call a function
// in splashForm to update
done = true;