【问题标题】:Threading options for long running process长时间运行进程的线程选项
【发布时间】:2011-08-17 22:49:45
【问题描述】:

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

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

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

使用 C# 3.5 Winform。

【问题讨论】:

  • 如果无法控制代码,如何加载?我问是因为你可能会产生一个单独的进程。

标签: c# winforms multithreading .net-3.5


【解决方案1】:

快速而肮脏的方法是使用内核和平台调用。

 [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

【讨论】:

    【解决方案2】:

    实际上,单独的 AppDomain 或 Process 是取消它的唯一安全方法。 Thread.Abort() 非常不安全,不建议这样做。

    【讨论】:

    • 我确实看到使用 Thread.Abort() 会导致问题,所以我打算避开它。我将看看如何使用 Process 并至少尝试使用 AppDomain。谢谢。
    • 是的,与 AppDomain 一起使用,看起来它可以正常工作。如果可以的话,我会给你投票。
    【解决方案3】:

    如果您在运行的单独线程中运行您的进程,您可以在其上调用Thread.Abort。不应该使用 Thread.Abort 的原因有很多,因此请仔细阅读警告。

    【讨论】:

      【解决方案4】:

      在您的线程中声明一个标志(例如 bool killme)并将其设置为 false。并查看 System.Threading 中的 Timer 以轮询此标志的值。如果为真,则退出线程。该计时器需要在线程初始化期间由线程创建。

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

      【讨论】:

      • 该链接显示了如何声明一个计时器。在你的线程初始化中使用它。
      【解决方案5】:

      有Thread.Abort(),但不能保证杀死线程。它的作用是在线程中引发 ThreadAbortException,这不一定会根据线程正在执行的操作而终止线程,例如 finally {} 块。

      最好放置某种合作标志,线程检查并优雅地清理并在看到后退出,但如果你别无选择,Thread.Abort() 就是它。请注意,如果线程代码正在设置锁等,除非线程具有处理 ThreadAbortException 并清理它们的逻辑,否则它们不会被清理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多