gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:28:03 24 4
gpt4 key购买 nike

我需要进行 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 was being aborted 错误。这是意料之中的。我对这个错误很好。对于我正在尝试做的事情来说没问题。

返回此错误时是否还有其他需要注意的原因?

最佳答案

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

您没有中止正在执行可能超时工作的线程。这很好,因为这将是非合作中止。您冒着许多后台线程累积并耗尽某些资源的风险。但如果这种风险是可以容忍的,你就没事。如果不能容忍,将对 COM 服务的调用包装在类似同步区域的 Semaphore 中,以限制最大资源使用量。

我想说您对 Response.Flush 的使用是有问题的,因为很少需要将字节刷新到客户端。这对我来说像是迷信的同花顺

关于c# - 通过 Response.End() 在 ASP.NET 中创建和中止线程有什么危害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com