完成后我应该如何处理线程?离开它还是中止它?

Posted

技术标签:

【中文标题】完成后我应该如何处理线程?离开它还是中止它?【英文标题】:What should I do with a thread when it's done ? leave it or abort it? 【发布时间】:2011-01-13 05:22:05 【问题描述】:

我在asp.net 应用程序中创建普通线程。线程完成后我该怎么办?离开它(它将返回线程池)或中止它。

Thread thread = new Thread(new ThreadStart(work));

【问题讨论】:

以这种方式创建线程使用线程池。 那么如果我让这些线程退出上下文会发生什么? 正如 Ani 指出的那样,上面的代码并没有给你一个线程池线程。如果您使用 .NET 4,请查看 BackgroudWorker 甚至 Task 类。 您无需执行任何操作。一旦线程完成运行work 中的代码,它将退出。但是,启动新线程可能会非常昂贵,因此除非work 做大量工作,否则最好使用线程池线程,因为它通过重用线程来分摊创建线程的成本。 【参考方案1】:

离开它。创建一个毫无意义的异常是没有意义的。

【讨论】:

【参考方案2】:

回想一下,IDisposable 接口的存在专门用于需要释放某些共享资源的场景。 (当然,它也被应用在其他情况下;但这就是它最初的用途。)

现在考虑托管Thread实现IDisposable,您可能(正确地)猜到它不需要除正常处理之外的任何特定清理由 GC。

【讨论】:

【参考方案3】:

在 C# 中使用线程池

   [STAThread]
    public static void Main(string[] args)
    
      foreach(var  fileNamePath in DirectoryFiles)
      
         ThreadPool.QueueUserWorkItem(ThreadPoolCallback, fileNamePath);
      
    

  public void ThreadPoolCallback(object threadContext)
  
       //do something 
  

.NET 中的线程池处理所有其他事情。

【讨论】:

以上是关于完成后我应该如何处理线程?离开它还是中止它?的主要内容,如果未能解决你的问题,请参考以下文章

离开 Activity 时 Android 如何处理后台线程?

合并后分支如何处理

如何处理完成处理程序块中取消的 NSURLSessionTask ?

如何处理数据集中的空白单元格

SpriteKit - 如何处理多种屏幕尺寸?

ThreadPool 如何处理传递的变量