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()方法放在一个委托中调用。

后续改进

将上述思路改进,参考迅投的重启配置,封装成自定义控件,方便所有程序复用。

posted @ 2021-12-17 10:40  LazyTiming  阅读(651)  评论(0编辑  收藏  举报