我有ASP.NET 4处理程序,必须响应少于50毫秒。在某些情况下,例如呼叫远程服务,它会挂起更长的时间。
是否有可能杀死(可能在IIS中)超过50毫秒的此类请求?
每秒约有1000个请求,如果我用超时将每个请求包装在单独的任务中,那么iis工作进程队列会极快地增加并挂起所有系统。它发生在iisrestart之后或者我们有很多超时服务的时候。
UPD:这是处理来自其他服务(服务器)的请求的API处理程序
UPD2:我已经在单独的任务中尝试了包裹请求,但是在每秒有很多请求的时候没有工作。即使使用threadpool
,创建单独的任务也太昂贵了TimeoutFunctionWrapper:
public static T Execute<T>(Func<T> func, int timeout)
{
object sync = new object();
bool isCompleted = false;
WaitCallback watcher = obj => {
Thread watchedThread = obj as Thread;
lock (sync)
{
if (!isCompleted)
{
Monitor.Wait(sync, timeout);
}
}
if (!isCompleted)
{
watchedThread.Abort();
}
};
try
{
ThreadPool.QueueUserWorkItem(watcher, Thread.CurrentThread);
return func();
}
catch (ThreadAbortException)
{
// This is our own exception.
Thread.ResetAbort();
return default(T);
}
finally
{
lock (sync)
{
isCompleted = true;
Monitor.Pulse(sync);
}
}
}
答案 0 :(得分:1)
您必须实现自己的超时机制。启动计时器并在50ms后取消所有未完成的工作。
Cancellation must be cooperative in .NET.没有其他现实的方法来取消工作。
可以取消对外部服务的请求。如何执行此操作取决于您使用的特定API。