c# – 通过Response.End()在ASP.NET中创建和中止线程有什么害处吗?

我需要进行COM调用,并且只想等待x秒才能返回调用.如果呼叫没有在x秒内返回,我想结束请求.

创建一个线程来进行调用.

string output = null;
Thread t = new Thread(() => { output = SomeHelper.DoWork(); });
t.Start();
t.Join(timeout);

if (string.IsNullOrEmpty(output))                
     this.Send500();

结束响应的方法.

protected void Send500()
{
    Response.ClearHeaders();
    Response.ClearContent();
    Response.Status = "500 ServiceUnavailable";
    Response.StatusCode = 500;
    Response.Flush();
    Response.SuppressContent = true;
    Response.End();
}

当Response.End()触发时,我得到一个Thread正在被中止错误.这是预料之中的.我错了.对于我正在尝试做的事情,这没关系.

当我需要注意这个错误时,还有其他原因需要注意吗?

最佳答案 通常,Thread.Abort是非常邪恶的,但是中止自己的线程是安全的.中止线程是危险的,因为中止可能发生在任何两个指令之间.但是,在一个明确定义的点上中止自己的线程.这使后果可预测.

您没有中止正在执行可能超时的工作的线程.这很好,因为这将是一次非合作中止.您冒着许多后台线程积累并耗尽一些资源的风险.但如果这种风险是可以忍受的,你就可以了.如果不能容忍,请将调用包装到信号量(如同步区域)中的COM服务,以限制最大资源使用量.

我会说你使用Response.Flush是有问题的,因为很少需要将字节刷新到客户端.这对我来说就像一个迷信的冲洗.

点赞