什么是正确的方式,以编程方式关闭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已经停止工作崩溃。

什么是实现我的目标的正确方法?再次,我要启动表单,打开它&

谢谢你,本。

什么是正确的方式,以编程方式关闭WinForms应用程序后,一段时间

创建一个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());
相关文章: