C# WinForm 程序啟動(主窗體初始化優化)


  在進入程序主界面時,某些情況下主界面的初始化會消耗很長時間,例如一些復雜的業務系統,可能會從服務器上下載最新的數據進行展示等等,在這種情況下,我們可以采用一個進度界面展示“系統正在加載...”,等主界面加載完之后,進度界面退出,主界面展示出來。

  在Program.cs中進行操作:

  實例包含三個窗體:主窗體(FrmMain)、登陸窗體(FrmLogin)、進度窗體(SplashScreen1)

using System;
using System.Windows.Forms;
using DevExpress.LookAndFeel;
using System.Threading;
using System.Reflection;
using System.Configuration;

namespace MainUSL
{
    static class Program
    {
        private static ApplicationContext context;
        private static  FrmMain mForm;
        private static Thread oThread;
        private static  SplashScreen1 sForm;  
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //DefaultLookAndFeel defaultLookAndFeel1 = new DefaultLookAndFeel();
            //defaultLookAndFeel1.LookAndFeel.SetSkinStyle("Office 2010 Blue");
            //string skinName = ConfigurationManager.AppSettings["ThemeSkin"].ToString();
            //UserLookAndFeel.Default.SkinName = skinName;
            UserLookAndFeel.Default.SkinName = "DevExpress Dark Style";
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
            bool bMutexCreated = true;
            using (new Mutex(true, Assembly.GetExecutingAssembly().FullName, out bMutexCreated))
            {
                if (!bMutexCreated)
                {
                    DevExpress.XtraEditors.XtraMessageBox.Show("已經存在一個實例在運行!");
                    return;
                }
                FrmLogin frmLogin = new FrmLogin();
                if (frmLogin.ShowDialog() == DialogResult.OK)
                {
                    DoStartup();
                }
            }
            //Application.Run(new FrmLogin());
            //Application.Run(new FrmMain());
        }
        static void DoStartup()
        {
            try
            {

                sForm = new SplashScreen1();
                //新建一個線程
                oThread = new Thread(new ThreadStart(ShowFlash));
                //設置線程級別
                oThread.Priority = ThreadPriority.Lowest;
                //后台線程
                oThread.IsBackground = true;
                //啟動flash
                oThread.Start();
                //事件訂閱(在線程結束時調用OnAppIdle方法)
                Application.Idle += new EventHandler(OnAppIdle);
                mForm = new FrmMain();
                //Application.Run(mForm);
                context = new ApplicationContext();
                Application.Run(context);
            }
            catch (Exception e)
            {
                CommonOperator.ExceptionClass.RecordException(e.ToString());
                Application.Exit();
            }
        }
        /// <summary>
        /// 線程結束后事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void OnAppIdle(object sender, EventArgs e)
        {
            try
            {
                if (context.MainForm == null)
                {
                    //取消事件訂閱
                    Application.Idle -= new EventHandler(OnAppIdle);
                    //標識狀態
                    //mForm.PreLoad();
                    //為當前線程設置主窗體
                    context.MainForm = mForm;
                    //啟動主界面
                    Thread.Sleep(5000);
                    context.MainForm.Show();
                    //終止flash
                    oThread.Abort();
                    GC.Collect();
                    Application.DoEvents();
                }
            }
           catch (Exception ex)
            {
                CommonOperator.ExceptionClass.RecordException(ex.ToString());
            }
        }

        static void ShowFlash()
        {
            sForm.ShowDialog();
        }
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM