在.NET Core中强制线程停止

时间:2018-06-20 21:11:40

标签: c# multithreading .net-core

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

重要说明:

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

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

df = df.sort_values(['case_nb', 'last_event'])
df['last_unassigned'] = df.groupby('case_nb')['last_event'].transform('last')
df.loc[(df['last_event'] == df['last_unassigned'])
        & (df['last_unassigned'] != df['cas_closed_date']), 'last_event'] = df['cas_closed_date']

尝试了几种选择:

从最重要到最小的担忧:

  • 释放锁
  • 使用指令处理对象
  • 实际收集分配的对象

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

1 个答案:

答案 0 :(得分:0)

使用ManualResetEventSlim。该实例将同时对您要停止的线程和将导致停止的线程可用。

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

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

这是等到ManualResetEvent进入Set状态或100ms(以先到者为准)。返回的值指示事件是Set还是Unset。您将从MRE处于Unset状态开始,当控制线程希望终止工作线程时,它将调用Set方法,然后可以加入工作线程以等待其完成。这很重要,因为在您的循环中,您可能正在等待网络调用完成,并且直到您再次回到循环的顶部,工作线程才真正终止。如果需要,可以在工作线程中的多个点上单击“等待”来检查MRE,以防止继续进行进一步的昂贵操作。