我需要从db4o数据库加载一些数据,这在我的应用程序启动时需要1或2秒,其余的必须等待,因为首先必须加载数据。在自己的线程中执行此操作意味着其余的必须等待线程完成。我想在加载数据期间做一个启动画面或其他东西,因为还需要一个自己的线程,对吗?你会怎么做?
我正在使用csharp,.net 3.5和winforms
答案 0 :(得分:5)
在启动时显示启动画面很容易。在应用程序的Main()方法中(在Program.cs中),在Application.Run(...)行之前输入类似的东西:
SplashForm splashy = new SplashForm();
splashy.Show();
Application.Run(new MainForm(splashy));
修改主窗体的代码和构造函数,使其看起来像这样:
private SplashForm _splashy;
public MainForm(SplashForm splashy)
{
_splashy = splashy;
InitializeComponent();
}
然后在MainForm的Load事件结束时(可能包含数据库代码),请输入以下代码:
_splashy.Close();
_splashy.Dispose();
如果您选择使用单独的Thread或BackgroundWorker进行数据库访问,那么您实际上并不需要启动屏幕,因为您需要在BackgroundWorker正在执行其操作时出现的某种进度指示器表单。这与我在这里的答案不同。
答案 1 :(得分:1)
一种方式,可能更好的方式。创建一个新的对话框表单,它将成为您的进度窗口/启动画面。扔一个位图或其他任何东西作为唯一的项目。从主程序实例化对话框。覆盖进度表单的Load事件,然后启动新线程,该线程将执行后台处理工作以加载数据。这样您就可以从主应用程序中调用ShowDialog。
如果您使用System.ComponentModel.BackgroundWorker,那么您可以轻松连接线程完成时的事件,并自动从该事件退出对话框。控制权返回给调用的应用程序,你就完成了。
我之前在应用程序中做过这种事情并且工作正常但我确信这是一种新手方法。这是来自启动后台线程的表单中的Load事件的示例代码(在我的情况下,我打开并解析大文件):
private void FileThreadStatusDialog_Load(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
if (m_OpenMode)
{
this.Text = "Opening...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
else
{
this.Text = "Saving...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
}
以下是工作完成方法的样子:
private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
FileThread = null;
DialogResult = DialogResult.OK;
Close();
}
以下是我从主对话框中打开进度对话框的方法:
FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
m_Engine = thread.Engine;
FillTree();
}
答案 2 :(得分:1)
有人可能想通过添加
强制在MusiGenesis的回答中画出诡异Application.DoEvents();
后立即
splashy.Show();