gpt4 book ai didi

c# - 在特定时间后以编程方式关闭 WinForms 应用程序的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:08:46 26 4
gpt4 key购买 nike

我以通常的方式开始我的表单:

Application.Run(new MainForm());

我希望它打开并运行到特定时间,然后关闭。我尝试了以下但无济于事:

(1) 在 Main 方法中(如果是 Application.Run() 语句),我在 Application.Run() 之后输入以下内容

while (DateTime.Now < Configs.EndService) { }

结果:它永远不会被击中。

(2) 在 Application.Run() 之前我开始一个新的后台线程:

        var thread = new Thread(() => EndServiceThread()) { IsBackground = true };
thread.Start();

EndServiceThread 在哪里:

    public static void EndServiceThread()
{
while (DateTime.Now < Configs.EndService) { }
Environment.Exit(0);
}

结果:vshost32.exe 已停止工作崩溃。

(3)在MainForm中勾选事件:

        if (DateTime.Now > Configs.EndService)
{
this.Close();
//Environment.Exit(0);
}

结果:vshost32.exe 已停止工作崩溃。

实现目标的正确方法是什么?同样,我想启动表单,让它打开并运行到特定时间 (Configs.EndService),然后关闭。

谢谢,本。

最佳答案

创建一个 Timer ,并让它在其事件处理程序中关闭程序。

假设您希望应用程序在 10 分钟后关闭。您使用 60,000 毫秒的周期初始化计时器。您的事件处理程序变为:

void TimerTick(object sender)
{
this.Close();
}

如果您希望它在特定的日期和时间关闭,您可以让计时器每秒滴答一次,然后根据所需的结束时间检查 DateTime.Now

这将起作用,因为 TimerTick 将在 UI 线程上执行。您的单独线程想法的问题是 Form.Close 是在后台线程上调用的,不是 UI 线程。这会引发异常。当您与 UI 元素交互时,它必须在 UI 线程上。

如果您调用 Form.Invoke 来执行 Close,您的后台线程想法可能会奏效。

您还可以创建一个 WaitableTimer 对象并为特定时间设置它的事件。该框架没有 WaitableTimer,但有一个可用。见文章Waitable Timers in .NET with C# .代码可在 http://www.mischel.com/pubs/waitabletimer.zip 获得

如果您使用 WaitableTimer,请注意回调在后台线程上执行。您必须 Invoke 才能与 UI 线程同步:

this.Invoke((MethodInvoker) delegate { this.Close(); });

关于c# - 在特定时间后以编程方式关闭 WinForms 应用程序的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com