我对表单加载进行了一些检查,但它将表单锁定一段时间(千分之几秒)。出于这个原因,我想显示一条消息,如“正在加载应用程序..”,但我不知道我是如何做到的。我希望这清楚!非常感谢任何帮助。提前谢谢。
答案 0 :(得分:10)
理想情况下,您要做的是在后台线程上执行检查,以便不阻止UI线程。看看BackgroundWorker课程。
您应该将检查挂钩到后台工作程序的DoWork事件,并从Form_Load事件中调用BackgroundWorker的RunWorkerAsync()
方法以启动后台工作。
像这样的东西(注意,这是未经测试的):
BackgroundWorker bw = new BackgroundWorker();
public void Form_Load(Object sender, EventArgs e) {
// Show the loading label before we start working...
loadingLabel.Show();
bw.DoWork += (s, e) => {
// Do your checks here
}
bw.RunWorkerCompleted += (s, e) => {
// Hide the loading label when we are done...
this.Invoke(new Action(() => { loadingLabel.Visible = false; }));
};
bw.RunWorkerAsync();
}
答案 1 :(得分:2)
您可以创建另一个线程来显示加载消息。
首先你需要一个布尔。
bool loading = true;
创建一个类似的线程:
Thread myThread = new Thread(new ThreadStart(Loading));
myThread .Start();
然后有一个方法:
private void Loading()
{
while(loading)
{
//Display loading message here.
}
}
当您完成加载任何刚设置加载为false并且胎面将终止时。
答案 2 :(得分:2)
查看BackgroundWorker组件。你根本不需要任何线程知识。
答案 3 :(得分:2)
这可以通过显示在另一个线程上执行的单独表单来轻松完成。在这种形式(称为frmSplash)中,您可以放置动画gif或静态文本。您需要的代码如下所示:
在课后声明一些变量。
public partial class frmMain : Form
{
public Thread th1;
static frmSplash splash;
const int kSplashUpdateInterval_ms = 1;
// Rest of code omitted
然后将以下方法添加到主窗体。这会启动启动画面:
static public void StartSplash()
{
// Instance a splash form given the image names
splash = new frmSplash(kSplashUpdateInterval_ms);
// Run the form
Application.Run(splash);
}
接下来,您需要一种关闭启动画面的方法:
private void CloseSplash()
{
if (splash == null)
return;
// Shut down the splash screen
splash.Invoke(new EventHandler(splash.KillMe));
splash.Dispose();
splash = null;
}
然后,在您的主要表单加载中,执行以下操作:
private void frmMain_Load(object sender, EventArgs e)
{
try
{
Thread splashThread = new Thread(new ThreadStart(StartSplash));
splashThread.Start();
// Set the main form invisible so that only the splash form shows
this.Visible = false;
// Perform all long running work here. Loading of grids, checks etc.
BindSalesPerson();
BindCustomer();
BindBrand();
// Set the main form visible again
this.Visible = true;
}
catch (Exception ex)
{
// Do some exception handling here
}
finally
{
// After all is done, close your splash. Put it here, so that if your code throws an exception, the finally will close the splash form
CloseSplash();
}
}
然后,如果主窗体已关闭,请确保您的启动画面也已关闭:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
// Make sure the splash screen is closed
CloseSplash();
base.OnClosing(e);
}
Splash表单的代码(在frmSplash.cs中)如下:
public partial class frmSplash : Form
{
System.Threading.Timer splashTimer = null;
int curAnimCell = 0;
int numUpdates = 0;
int timerInterval_ms = 0;
public frmSplash(int timerInterval)
{
timerInterval_ms = timerInterval;
InitializeComponent();
}
private void frmSplash_Load(object sender, EventArgs e)
{
this.Text = "";
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ControlBox = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Menu = null;
}
public int GetUpMilliseconds()
{
return numUpdates * timerInterval_ms;
}
public void KillMe(object o, EventArgs e)
{
//splashTimer.Dispose();
this.Close();
}
}
我希望这会对你有所帮助。它可能不是有史以来最好的代码,但它对我有用。
答案 4 :(得分:0)
你需要在这里创建一个frmloading的表单..你需要创建该表单的对象并使用线程概念调用..并在FrmLoading中放置一个Picturebox并在其中设置.gif图像。
meta_value : a:1:{i:0;a:4:
{s:11:""optionLabel"";s:7:""Address"";s:11:""optionValue"";s:21:""Dune du Pilat,
France"";s:9:""optionUrl"";s:0:"""";s:22:""optionlabelordernumber"";s:1:""1"";}}
如上图所示,您需要创建PleaseWait类。
PleaseWait.cs
FrmLoading f2 = new FrmLoading();
using (new PleaseWait(this.Location, () =>MethodWithParameter())) { f2.Show(this); }
f2.Close();