一种高并发的解决过程记录
今天服务器出现了大量的CLOSE_WAIT,现在记录该解决过程
首先代码上解决
private async Task<T> GetResult<T>(Func<T> func)
{
if (!HttpContext.Current.Response.IsClientConnected)
return default(T); //当检测到连接已断开,就不再执行此任务了,避免进入task浪费资源
T result = default(T);
var task = Task.Run(() =>
{
return func.Invoke();
});
SpinWait.SpinUntil(() => task.IsCompleted || task.IsCanceled || !HttpContext.Current.Response.IsClientConnected || task.IsFaulted, new TimeSpan(0, 3, 0));
if (!HttpContext.Current.Response.IsClientConnected)
return result;
else
return await task;
}