C# 终止线程而不影响当前线程
每个人都知道线程应该优雅地退出,但现在我必须杀死一个线程 当有请求提交时,我启动一个线程,如下所示C# 终止线程而不影响当前线程,c#,multithreading,C#,Multithreading,每个人都知道线程应该优雅地退出,但现在我必须杀死一个线程 当有请求提交时,我启动一个线程,如下所示 _thread = new Thread(ProcessTemplate); _thread.Start(); 在ProcessTemplate方法中,它使用googlev8编译并运行从客户端发送的javascript代码 问题是,从客户端发送的javascript可能有缺陷,并导致无限循环 因此,我计算线程启动后的时间,如果javasctript执行时间超过10秒,我会像这样终止线程 try
_thread = new Thread(ProcessTemplate);
_thread.Start();
在ProcessTemplate
方法中,它使用googlev8编译并运行从客户端发送的javascript代码
问题是,从客户端发送的javascript可能有缺陷,并导致无限循环
因此,我计算线程启动后的时间,如果javasctript执行时间超过10秒,我会像这样终止线程
try
{
_thread.Abort();
}
catch
{
}
它可以工作,但也会影响启动_线程的当前线程。
我收到当前线程的“线程被中止”异常
如何避免/忽略异常?您可以使用
任务
并向其传递取消令牌
我收到当前线程的“线程被中止”异常
您在后台线程中收到此异常,而不是在启动它的主线程中:
在调用ThreadAbortException的线程中引发ThreadAbortException,以
开始终止线程的过程。调用此方法
通常终止线程
因此,在此后台线程中,您可以处理此异常:
_thread = new Thread(() =>
{
try
{
ProcessTemplate();
}
catch (ThreadAbortException ex)
{
// the thread was aborted, call ResetAbort to
// avoid rethrowing the exception
Thread.ResetAbort();
}
);
您可能看到主线程受到影响,因为在某些情况下,后台线程中未处理的异常可能会导致AppDomain崩溃。所以通常你应该处理这些异常
我收到当前线程的“线程被中止”异常
因为这就是你打电话时发生的事情:
在线程上调用此方法时,系统将抛出
线程中的ThreadAbortException以中止它。线程异常
是应用程序代码可以捕获的特殊异常,但是
除非调用ResetAbort,否则在catch块末尾重新抛出。
您应该在后台线程中捕获ThreadAbortException
,并确保其已被处理
我建议不要使用,而是使用任务并行库
中允许协作取消的新功能:
var cts = new CancellationTokenSource();
var ct = cts.Token;
var javaScriptTask = await Task.Run(() => ProcessTemplate, cts.Token);
并在ProcessTemplate
内监视CancellationToken
:
ct.ThrowIfCancellationRequest();
或者,如果在执行阻塞调用时确实需要完全控制,则应该旋转一个新进程来运行任务。可以对每个线程使用操作。如何知道当前线程上存在异常?相关阅读:@Daan我也很高兴知道。