长时间运行进程的线程选项

本文关键字:线程 选项 进程 运行 长时间 | 更新日期: 2023-09-27 17:54:22

哪种线程模型最适合这个场景:我有一个进程可能需要几分钟才能完成,一旦它启动,我就无法控制运行的代码。该进程要么出错,要么返回结果。

我想允许用户取消进程。我不需要流程报告其进度,只需要它完成或出现错误即可。如果进程被取消,则不需要清理。

我查看了各种线程选项,并注意到要添加取消,似乎我需要在运行代码中实现某种取消标志,这在我的情况下是不可能的。添加线程超时也是不实际的。我想过在AppDomain中运行我的进程,但感觉这种方法可能是死路一条。

长时间运行进程的线程选项

实际上,单独的AppDomain或Process是取消它的唯一安全方法。Thread.Abort()是非常不安全的,是不明智的吗?

有thread. abort(),但它不能保证杀死线程。它所做的是在线程中引发ThreadAbortException,这并不一定会杀死线程,这取决于它正在做什么,就像finally{}块一样。

最好放入某种合作标志,让线程检查并优雅地清理并在看到后退出,但如果你没有选择,thread . abort()就可以了。注意,如果线程代码设置了锁之类的,它们不会被清除,除非线程有逻辑处理ThreadAbortException并清除它们。

在线程中声明一个标志(例如bool killme)并将其设置为false。看看系统中的计时器。线程轮询此标志的值。如果为true,则退出线程。这个定时器需要在线程初始化时创建。

它将在你的线程进程中执行,这意味着线程知道他需要被停止,并且可以在离开之前做一些动作(如关闭打开的文件等)。

如果你在一个单独的线程中运行你的进程,你可以调用thread。中止它。有很多原因,为什么线程。不应该使用Abort,因此请仔细阅读警告。

最快捷的方法是使用内核和平台调用。

 [System.Runtime.InteropServices.DllImport("kernel32.dll")]
  static extern IntPtr OpenThread(uint dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
 [System.Runtime.InteropServices.DllImport("kernel32.dll")]
  static extern bool TerminateThread(IntPtr hThread, uint dwExitCode);

从OpenThread中获取指针并在TerminateThread中使用。你需要使用线程中的threadID作为OpenThread的最后一个参数。

请注意,这通常是一个非常糟糕的主意,尽管有时脏总比不存在好。

我这样说是因为我假定您不能使用取消标志。如果可以,这永远是最好的方法。我的博客上有一个样本。

http://memmove.blogspot.com/2011/04/treating-thread-as-service.html