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()方法放在一个委托中调用。
后续改进
将上述思路改进,参考迅投的重启配置,封装成自定义控件,方便所有程序复用。