c# - 在 .NET Core 中强制线程停止

标签 c# multithreading .net-core

假设我有 .NET Core 2.0/2.1 程序。 有一个线程正在执行以下方法。我想强行阻止它。

重要提示:

协作式多任务处理(例如,使用 CancellationToken)是一件好事,但事实并非如此

XY 问题 (https://en.wikipedia.org/wiki/XY_problem) 确实存在,但我只想知道是否真的可以停止此线程

while (true)
{
    var i = 0;
    try
    {
        Console.WriteLine($"Still alive {i++}");
    }
    catch (Exception e)
    {
        Console.WriteLine($"Caught {e.GetType().Name}");
    }
}

尝试了几种选择:

关注点,从最重要到最不重要:

  • 释放锁
  • 在 using 指令中处理对象
  • 实际收集分配的对象

(作为极端情况,我们可以假设 out 线程根本不执行任何堆分配)

最佳答案

使用 ManualResetEventSlim .该实例将需要对您尝试停止的线程和将导致停止的线程都可用。

在您的 while(true) 循环中,执行如下操作:

var shouldTerminate = mres.Wait(100);
if (shouldTerminate) { break; }

这样做是等待 ManualResetEvent 进入设置状态,或 100 毫秒,以先到者为准。返回的值指示事件是已设置还是未设置。您将从处于 Unset 状态的 MRE 开始,当控制线程希望终止工作线程时,它将调用 Set 方法,然后它可以加入工作线程以等待它完成。这很重要,因为在您的循环中您可能正在等待网络调用完成,并且在您再次回到循环顶部之前工作人员不会真正终止。如果需要,您可以在工作线程中的多个点使用 Wait 检查 MRE,以防止继续进行更多昂贵的操作。

关于c# - 在 .NET Core 中强制线程停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957086/

相关文章:

c# - 一道C#语法问题

c# - 使用 AutoMapper 将复杂的 View 模型映射回具有集合属性的模型

c 多线程进程

asp.net - "Blazor (ASP.NET Core hostd)"可以使用windows认证吗?

msbuild - AppendTargetFrameworkToOutputPath 在 .targets 文件中失败

nuget - 如何知道 nuget 包是否适用于 .NET Core?

c# - 没有接口(interface)甚至没有虚拟方法的模拟类

c# - 服务器/客户端未发送所有字节(TCP 套接字)

python - Python中的后台函数

c++ - 在后台启动程序