【问题标题】:How to kill a thread in asp.net core如何杀死asp.net核心中的线程
【发布时间】:2019-08-02 20:03:53
【问题描述】:

我正在使用 asp.net 核心编写一个应用程序,我需要在其中创建一个新线程,因为我有一个始终在运行的循环。在某些时候,我需要研磨这个线程。在 asp.net 中,Thread.abort 是解决方案,但它在 asp.net 核心中被删除。有什么替代解决方案?

【问题讨论】:

  • 一个始终在运行的循环 在网络环境中似乎是一个非常糟糕的主意。我想你是在你的网络服务器上产生内存泄漏。 什么是替代解决方案根本不这样做......永远?!无论哪种方式,它都是nice to see some code。您还应该使用Task 而不是Thread
  • 致电Thread.Abort() 几乎不是解决方案。它可能会破坏剩余线程的运行时。仅当您试图完全退出应用程序时才应该调用它。
  • 循环是监控传感器,这就是为什么我不能逃避它
  • “一个始终运行的线程”的想法与“在某些时候,我需要杀死这个线程”是不一致的。
  • 线程,根据定义,在任何语言中,通过作用于共享变量进行通信。如果你强行杀死一个线程,你就有可能让共享变量处于不一致的状态。在允许其他线程继续运行的同时强行杀死一个线程总是不好的做法。线程应该合作。如果线程 A 需要线程 B 死亡,那么线程 A 应该发送消息要求线程 B 死亡,并且线程 B 应该被设计为通过 干净 关闭自身来处理请求下来。

标签: c# multithreading asp.net-core .net-core


【解决方案1】:

不要为这样的事情创建自己的线程!

在 asp.core 中有一个使用长时间运行任务的内置方法。你应该阅读这个here

您应该创建一个派生自BackgroundService 的类。使用此类是创建实现IHostedService 的后台服务的最简单方法。然后,您可以通过在 ConfigureServices 方法中调用 services.AddHostedService<YourBackgroundService>() 将其添加到您的程序中。

注意:在我链接的页面中,他们使用AddSingleton 而不是AddHostedService。在 .net core 2.1 及更高版本中,您应该使用AddHostedService,而不是AddSingleton(有一些例外,但我们在这里一般讨论)。请参阅this answer 了解原因。

如果您像这样实现后台服务,则会为您处理额外线程的关闭。在ExecuteAsync 的实现中,您只需检查是否应该停止使用提供的CancellationToken 执行。您还应该尽可能使用asnyc 实现并在那里提供CancellationToken,以便线程可以优雅地结束。 您永远不需要致电Thread.Abort,甚至无需访问Thread 本身;这一切都在后台为您完成。

由于这不是对您提出的问题的直接回答,而是更正了您可能首先遇到这种情况而做错了什么,因此我首先想发表评论。然而它太长了,有太多东西要提到这就是为什么我把它变成一个答案。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    通过“杀死”线程设置并由需要被杀死的线程定期检查的标志来执行此操作的最干净的方法。 Thread.Abort() 不是一种可靠的方法;甚至 MSDN 都说调用这个方法通常会终止线程。

    【讨论】:

    • 一般来说,这是完全正确的。然而 OP 正在谈论 asp.net 核心,你真的不应该创建自己的线程。请参阅 my answer 以了解该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多