假设我有.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线程根本不执行任何堆分配)
答案 0 :(得分:0)
使用ManualResetEventSlim。该实例将同时对您要停止的线程和将导致停止的线程可用。
在您的while(true)
循环中,执行以下操作:
var shouldTerminate = mres.Wait(100);
if (shouldTerminate) { break; }
这是等到ManualResetEvent进入Set状态或100ms(以先到者为准)。返回的值指示事件是Set还是Unset。您将从MRE处于Unset状态开始,当控制线程希望终止工作线程时,它将调用Set方法,然后可以加入工作线程以等待其完成。这很重要,因为在您的循环中,您可能正在等待网络调用完成,并且直到您再次回到循环的顶部,工作线程才真正终止。如果需要,可以在工作线程中的多个点上单击“等待”来检查MRE,以防止继续进行进一步的昂贵操作。