在主窗体关闭并且不等待线程完成后让线程运行

Posted

技术标签:

【中文标题】在主窗体关闭并且不等待线程完成后让线程运行【英文标题】:Letting a thread run after main form closes and doesn't wait for thread to finish 【发布时间】:2014-03-07 20:54:00 【问题描述】:

是否可以创建一个简单的线程,它运行一条 SQL 语句,然后关闭应用程序但让该线程运行直到它完成(主窗体仍然正常关闭 - 不等待线程完成)。

我正在升级一个将一些测试数据写入日志文件的应用程序,并且我想将该日志文件批量插入到数据库中。因为有很多数据并且处理它的 sql 存储过程需要一两分钟才能完成,所以我创建了一个运行存储过程的线程。该线程在应用程序的生命周期中经常运行,但现在我想实现,以便在用户完成测试并关闭应用程序后,日志中尚未在服务器上的其余数据是同步。这样,如果所有数据都已同步,我就可以避免检查前几天的日志。

如果我使用waitfor 函数,整个应用程序在存储过程完成之前不会关闭,这是不可取的,因为之后应用程序无需执行任何操作。存储过程会处理所有错误,因此无需在应用程序中处理错误。

如果我没记错的话,这是在 linux 中经常做的事情,一个过程会创建另一个过程,然后结束,然后子 proc 被孤立,这就是恶魔的运行方式。但我不知道这在 Windows 上是否可行。

【问题讨论】:

【参考方案1】:

进程需要保持活动状态,直到线程完成。线程存在于进程中。带走进程,线程无法忍受。

您可以做的是在 UI 关闭后等待线程。将等待线程的代码放在 UI 关闭后运行的方法中。

或者,如果您希望 UI 进程在任务完成之前终止,则该任务必须存在于单独的进程中。您将启动一个新进程来执行该任务。这在支持fork() 的类Unix 系统中要容易得多。在 Windows 下,您需要找到一种将数据导入新进程的方法。

【讨论】:

啊,我知道我把新线程和新进程混在一起了。在此阶段将数据导入新进程应该不是问题,因为它始终是一个日志文件,名称为今天的日期。

以上是关于在主窗体关闭并且不等待线程完成后让线程运行的主要内容,如果未能解决你的问题,请参考以下文章

WinForm 进程 ,线程

C#多线程-等待方法完成,然后再次运行。[关闭]

主线程结束后如何保持任务运行?

MFC 如何在主线程中判断子线程是不是运行,运行则关闭子线程?

C# 中 UI 线程和子进程之间的低延迟 IPC [关闭]

如何在主线程上安全地使用[NSTask waitUntilExit]?