Счетчик с очередью

243
09 февраля 2018, 18:02

Реализовывал счетчик задач с очередью, но возникает timeout на последней пачке запросов, клиент ожидает и соединение разрывается. Скорее всего проблема в том, что очередь не до конца обрабатывается, как решить проблему?

try
    {
        if (listener.IsListening)
        {
            var context = listener.GetContext();
            var limitTask = 500;
            var limitRequest = 100;
            if (queueContext.Count() > limitRequest)
            {
                context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
                context.Response.Close();
            }
            if (!queueContext.Any() && countTask < limitTask)
            {
                Task.Run(() =>
                {
                    while (queueContext.TryDequeue(out context))
                    {
                        Interlocked.Increment(ref countTask);
                        var task = Task.Run(() => HandleContextAsync(context).ContinueWith(delegate { Interlocked.Decrement(ref countTask); }));
                        var timeOfProcessing = TimeSpan.FromMilliseconds(1000);
                        if (!task.Wait(timeOfProcessing))
                        {
                            context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
                            context.Response.Close();
                        }
                     }
                });
            }
            if (countTask < limitTask)
            {
                Interlocked.Increment(ref countTask);
                var task = Task.Run(() => HandleContextAsync(context)).ContinueWith(delegate { Interlocked.Decrement(ref countTask); });
                var timeOfProcessing = TimeSpan.FromMilliseconds(1000);
                if (!task.Wait(timeOfProcessing))
                {
                    context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
                    context.Response.Close();
                }
            }
            else
                queueContext.Enqueue(context);
        }
    }
     private async Task HandleContextAsync(HttpListenerContext listenerContext)
    {
        //обработка запроса
        listenerContext.Response.StatusCode = (int)HttpStatusCode.OK;
        listenerContext.Response.Close();
    }
READ ALSO
Работа с gridView в asp.net

Работа с gridView в asp.net

ЗдравствуйтеЕсть на странице gridView

224
Когда и для каких целей может потребоваться использовать контекст потока?

Когда и для каких целей может потребоваться использовать контекст потока?

У потока может быть контекст(GUI приложение), а может и не быть(Консольное приложение)

219
Разница между Invoke и обычным вызовом делегата через ()

Разница между Invoke и обычным вызовом делегата через ()

В чём разница между Invoke и обычным вызовом делегата через () в C#?

239
Сравнить две картинки на разных сайтах [требует правки]

Сравнить две картинки на разных сайтах [требует правки]

Как сравнить две картинки на разных сайтах? Интересует именно само сравнениеВся процедура по вытаскиванию картинок и обращение к сайтам...

249