我需要进行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是有问题的,因为很少需要将字节刷新到客户端.这对我来说就像一个迷信的冲洗.