C# 闪屏线
因此,我有一个启动屏幕,其中将有一些时间密集型代码,我不希望它在主线程中运行。我已经编写了一些代码,应该停止线程并关闭表单,但它不起作用。欢迎任何帮助 代码: 程序仅停留在该屏幕上: 编辑: 我可以使用以下代码修复此问题:C# 闪屏线,c#,winforms,splash-screen,C#,Winforms,Splash Screen,因此,我有一个启动屏幕,其中将有一些时间密集型代码,我不希望它在主线程中运行。我已经编写了一些代码,应该停止线程并关闭表单,但它不起作用。欢迎任何帮助 代码: 程序仅停留在该屏幕上: 编辑: 我可以使用以下代码修复此问题: Invoke((MethodInvoker)delegate { MyNextForm.Show(); }); 它在UI线程上调用MyNextForm.Show()。当线程中有thread.sleep时,主线程将继续执行代码 if (splashCont) { sp
Invoke((MethodInvoker)delegate { MyNextForm.Show(); });
它在UI线程上调用
MyNextForm.Show()
。当线程中有thread.sleep时,主线程将继续执行代码
if (splashCont)
{
splash.Abort();
this.Close();
}
将在设置splashCnt=true之前执行
检查你是否真的需要睡眠线程,如果需要,然后需要考虑解决它
如果您真的想让线程休眠,那么可以让主线程等待子线程完成
while (splash.IsAlive)
{
Thread.Sleep(1000);
}
if (splashCont)
{
splash.Abort();
this.Close();
}
如果您希望以启动屏幕的形式完成工作,可以大大简化。这假设您的五秒钟睡眠模拟正在进行的启动工作。这样,启动工作完成后,splash表单就会自动关闭
partial class Cobalt : Form
{
public Cobalt()
{
this.Text = "Cobalt V1.0.0";
this.Width = 400;
this.Height = 100;
this.BackgroundImage = Properties.Resources.cobaltlgo;
this.FormBorderStyle = FormBorderStyle.None;
this.TopMost = true;
this.StartPosition = FormStartPosition.CenterScreen;
this.Show();
splashLoadAction();
this.Close();
}
private void splashLoadAction()
{
Thread.Sleep(5000);
}
}
你应该在闪屏窗体中放置一个计时器,并在时间过去后关闭它。您可能希望修改应用程序入口点,以便在启动主应用程序窗体之前显示此窗体 在实际应用程序中,如果您希望在应用程序未准备就绪或主窗体实际显示之前,保持飞溅显示更长时间,则可能会比这更复杂 如果需要时间来显示主应用程序窗口,这可能很有用,因为在启动关闭和应用程序可见之间的几秒钟内没有显示任何窗口,这可能会让用户认为应用程序已崩溃
使用计时器、空闲和可见性事件,一旦你了解了所有事情的工作原理,你可以做任何你想做的事情。但是主线程停止,GUI不出现如果你不想放线程。在平均线程中睡眠,那么你可能不得不使用线程。从线程调用的方法中睡眠。什么是“不工作”意思是?另外,如果你调用
Thread.Abort()
,那么你做的事情非常错误,除非你试图强制关闭整个应用程序。好主意。我会考虑他们
partial class Cobalt : Form
{
public Cobalt()
{
this.Text = "Cobalt V1.0.0";
this.Width = 400;
this.Height = 100;
this.BackgroundImage = Properties.Resources.cobaltlgo;
this.FormBorderStyle = FormBorderStyle.None;
this.TopMost = true;
this.StartPosition = FormStartPosition.CenterScreen;
this.Show();
splashLoadAction();
this.Close();
}
private void splashLoadAction()
{
Thread.Sleep(5000);
}
}