1. 程式人生 > 其它 >Winform自動重啟

Winform自動重啟

引言

由於交易所的伺服器通常會在結算時間內關閉,很多軟體都會通過重啟解決行情重連的問題。
以前直接通過看門狗對程式進行控制,最近使用迅投的時候發現他的自動重啟做的挺好,所以順便給歷史版本的winform程式新增類似功能。

簡單測試

    public partial class Form1 : Form
    {
        delegate void FormControl(); // 新增委託代理

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DateTime restartTime = DateTime.Now.AddSeconds(10);
            Task.Run(async () =>
            {
                while(DateTime.Now < restartTime)
                {
                    await Task.Delay(1000 * 2);
                }

                restart();
            });
            button1.Enabled = false;
        }


        private void restart()
        {
            this.Invoke(new FormControl(async () =>
            {
                button1.Enabled = true;
                await Task.Delay(1000 * 10);
                Application.Restart();
            }));
            
        }
    }

按下按鈕之後,按鈕變為不可用,等待20秒之後,按鈕變為可用,等待10秒後實現重啟。
由於子執行緒中不能直接呼叫主執行緒中的物件,所以將Application.Restart()方法放在一個委託中呼叫。

後續改進

將上述思路改進,參考迅投的重啟配置,封裝成自定義控制元件,方便所有程式複用。