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

时间:2011-05-03 18:22:18

标签: c# winforms multithreading .net-3.5

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

我想允许用户取消该过程。我不需要流程报告其进度,只需要完成报告或发生错误。如果取消该过程,则无需清理。

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

使用C#3.5 Winform。

5 个答案:

答案 0 :(得分:3)

实际上,单独的AppDomain或Process是取消它的唯一安全方法。 Thread.Abort()是非常不安全的,是否被禁止。

答案 1 :(得分:1)

有Thread.Abort(),但不能保证杀死线程。它的作用是在线程中引发一个ThreadAbortException,它不一定会根据它正在做什么来杀死线程,比如finally {}块。

最好放入一些合作标志,线程检查并优雅地清理并在看到时退出,但如果你没有选择,Thread.Abort()就是关于它的。请注意,如果线程代码设置了锁等,除非线程有逻辑来处理ThreadAbortException并清理它们,否则它们不会被清除。

答案 2 :(得分:1)

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

它将在您的线程过程中根据需要和线程执行,这意味着线程知道他需要停止并且可以在离开之前执行某些操作(如关闭打开的文件等)。

答案 3 :(得分:0)

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

 [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

答案 4 :(得分:0)

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