什么是正确的方式,以编程方式关闭WinForms应用程序后,一段时间
本文关键字:方式关 WinForms 应用程序 一段时间 编程 方式 什么 | 更新日期: 2023-09-27 18:04:31
我以通常的方式开始我的表单:
Application.Run(new MainForm());
我希望它打开并运行到一定时间,然后关闭。我尝试了以下方法,但没有效果:
(1)在Main方法(Application.Run()语句所在的地方)中,我输入以下语句AFTER Application.Run()
while (DateTime.Now < Configs.EndService) { }
结果:它永远不会被击中。
(2)在Application.Run()我开始一个新的后台线程:
var thread = new Thread(() => EndServiceThread()) { IsBackground = true };
thread.Start();
where EndServiceThread is:
public static void EndServiceThread()
{
while (DateTime.Now < Configs.EndService) { }
Environment.Exit(0);
}
结果:vshost32.exe已经停止工作崩溃。
(3) In MainForm Tick Event:
if (DateTime.Now > Configs.EndService)
{
this.Close();
//Environment.Exit(0);
}
结果:vshost32.exe已经停止工作崩溃。
什么是实现我的目标的正确方法?再次,我要启动表单,打开它&谢谢你,本。
创建一个Timer,并让它在事件处理程序中关闭程序。
假设您希望应用程序在10分钟后关闭。初始化定时器的周期为60000毫秒。事件处理程序变为:
void TimerTick(object sender)
{
this.Close();
}
如果您希望它在特定的日期和时间关闭,您可以让计时器每秒滴答一次,并根据所需的结束时间检查DateTime.Now
。
这将工作,因为TimerTick
将在UI线程上执行。你的单独线程的想法的问题是,Form.Close
被调用的背景线程,而不是 UI线程。这会抛出一个异常。当你与UI元素交互时,它必须在UI线程上。
你的后台线程的想法可能会工作,如果你调用Form.Invoke
执行Close
。
您还可以创建一个WaitableTimer
对象并为其设置特定时间的事件。框架没有WaitableTimer
,但有一个可用。请参阅文章。net与c#中的可等待计时器。代码可从http://www.mischel.com/pubs/waitabletimer.zip
如果你使用WaitableTimer
,建议回调在后台线程上执行。您必须使用Invoke
来与UI线程同步:
this.Invoke((MethodInvoker) delegate { this.Close(); });
这样如何:
public partial class Form1 : Form
{
private static Timer _timer = new Timer();
public Form1()
{
InitializeComponent();
_timer.Tick += _timer_Tick;
_timer.Interval = 5000; // 5 seconds
_timer.Start();
}
void _timer_Tick(object sender, EventArgs e)
{
// Exit the App here ....
Application.Exit();
}
}
是否存在"ServiceEnded"事件?如果是,请在服务结束时关闭您的表单。
如果你使用System.Threading.Timer
,你可以使用DueTime
来设置它第一次触发的时间作为你想要关闭应用程序的时间
new System.Threading.Timer((o) => Application.Exit(), null, (Configs.EndService - DateTime.Now), TimeSpan.FromSeconds(0));
Application.Run(new Form1());