再次运行应用程序时如何停止关闭的应用程序留下的线程? C#

Posted

技术标签:

【中文标题】再次运行应用程序时如何停止关闭的应用程序留下的线程? C#【英文标题】:How to stop a thread left from a closed app when running the app again? C# 【发布时间】:2021-05-14 07:22:29 【问题描述】:

我有一个 .NET 5.0 WPF 应用程序,它由 2 个线程组成:UI 线程另一个线程,它们应该始终在后台工作并获得一些实时信息来自 API 的数据并将其保存到 mysql 数据库。然后,UI 线程在每次更新时读取数据库并在图表中显示数据。

问题是 我需要数据获取线程在后台运行,即使在关闭 UI 之后也是如此。发生这种情况时,线程通常会将数据保存到数据库中,但是一旦我再次启动应用程序,就会启动一个新的数据线程,然后有 2 个线程在后台做同样的事情

我不能创建Environment.Exit(0);,因为这样数据库和图表中就会有一些“漏洞”,它不会是完整的,除非我让应用程序的 UI 始终运行最小化,但这并不高效并且不需要。

我希望应用程序以某种方式检测其旧实例中的线程是否正在运行,并基于该线程运行或不运行新线程,并从数据库中获取仍在运行的线程保存的数据。

目前,线程在 MainWindow 加载事件上运行 它是这样创建的:

        Thread StockMarketThread = new Thread(new ThreadStart(updateData));

        public static void updateData()
        
            while(true)
            
                getsetData();        //gets data from API and updates the database
                Thread.Sleep(60000);
            
        

【问题讨论】:

您询问的是进程间通信 (IPC)。做研究,选择一个。 如果后台工作总是需要运行,它应该作为服务运行,而不是作为 UI 进程中的线程。如果它并不总是需要运行,它应该随着 UI 启动和停止。留下僵尸线程的应用程序不是一个好的设计。 如果它必须不断地从 api 读取数据,当用户关闭他们的电脑时会发生什么?听起来这个数据库应该在一个带有守护进程或 Windows 服务的服务器上,它读取数据并将其保存到数据库中。您可以使用 signalr 从服务器推送通知更改。或者如果这一切都在一个场所,则使用 rabbitmq 将它们连接起来。 感谢您的所有建议。在后台运行的应用程序不是必需的,它只是创建一个带有实时数据的图表,所以它很棒,它可以在计算机关闭时关闭。我只有一个问题,如果另一个线程应该在后台工作,Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 不会以这种方式工作,如果我将关闭按钮的事件设置为This.Close(); 而不是Application.Current.Shutdown();?线程会在后台工作,还是会在每次启动应用程序时创建新实例? @TechrexStudios:你看我的回答了吗?线程不能活得比进程长。 【参考方案1】:

线程存在于进程中。当进程(在本例中是您的 WPF 应用程序)退出其中的所有线程时停止。

您可以将工作线程作为 前台 线程运行,以防止 WPF 应用程序在后台工作完成之前关闭,但您可能想要做的是将后台工作移至单独的无论您的 UI 应用是否正在运行,(后端)进程都会运行。

这是“让 [the] 线程在后台运行,即使在关闭 UI [进程]”并避免数据中出现“漏洞”的唯一方法。

UI 应该只是在另一个进程中生成的数据的消费者,该进程通常在某种服务器上运行。

【讨论】:

以上是关于再次运行应用程序时如何停止关闭的应用程序留下的线程? C#的主要内容,如果未能解决你的问题,请参考以下文章

如果程序关闭,Java如何停止线程

为啥在VC编写程序时 点运行 他会跳出 :当前程序正在运行,如果想再次运行当前程序请先关闭当前的程序?

应用关闭前的离子运行功能

Android 进入后台时游戏也停止运行了,怎么破

上传数据后停止计算,直到再次点击运行

Java并发编程学习15-任务关闭(下)