Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 终止线程而不影响当前线程_C#_Multithreading - Fatal编程技术网

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我也很高兴知道。