С# как контролировать RPS

230
10 марта 2018, 16:27

Задача: каждый запрос должен выполняться не более 1 секунды, иначе его нужно отклонить. При большом количестве запросов, запросы начинаются скапливаться и соответственно, если до них очередь ещё долго не дойдет - отклонить их сразу

Как можно это контролировать? Есть ли какой-то простой способ решения? Или нужно пытаться для каждого запроса добавить секундомер и при достижении 1 секунды пытаться освободить поток?

Ниже реализация сервера, где каждый запрос - это отдельный поток

namespace TestServer
{
    internal class AsyncHttpServer : IDisposable
    {
        public AsyncHttpServer()
        {
            listener = new HttpListener();
        }
        public void Start(string prefix)
        {
            lock (listener)
            {
                if (!isRunning)
                {
                    listener.Prefixes.Clear();
                    listener.Prefixes.Add(prefix);
                    listener.Start();
                    listenerThread = new Thread(Listen)
                    {
                        IsBackground = true,
                        Priority = ThreadPriority.Highest
                    };
                    listenerThread.Start();
                    isRunning = true;
                }
            }
        }
        public void Stop()
        {
            lock (listener)
            {
                if (!isRunning)
                    return;
                listener.Stop();
                listenerThread.Abort();
                listenerThread.Join();
                isRunning = false;
            }
        }
        public void Dispose()
        {
            if (disposed)
                return;
            disposed = true;
            Stop();
            listener.Close();
        }
        private void Listen()
        {
            while (true)
            {
                try
                {
                    if (listener.IsListening)
                    {
                        var context = listener.GetContext();
                        Task.Run(() => HandleContextAsync(context));
                    }
                    else Thread.Sleep(0);
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception error)
                {
                    Console.Write(error);
                }
            }
        }
        private async Task HandleContextAsync(HttpListenerContext listenerContext)
        {
            listenerContext.Response.StatusCode = (int)HttpStatusCode.OK;
            using (var writer = new StreamWriter(listenerContext.Response.OutputStream))
                writer.WriteLine("");
        }
        private readonly HttpListener listener;
        private Thread listenerThread;
        private bool disposed;
        private volatile bool isRunning;
    }
}
READ ALSO
Как получать компоненты через GetComponent из массива? UNITY, C#

Как получать компоненты через GetComponent из массива? UNITY, C#

как получить getcomponent transform из элемента массива (например, i)?

231
Несколько вопросов по C# обфускации (SmartAssembly, internal функции)

Несколько вопросов по C# обфускации (SmartAssembly, internal функции)

Экспериментирую с различными обфускаторами, чтобы защитить свой код от повторного использования

266
C# и chart для финансовых рынков

C# и chart для финансовых рынков

Хочу реализовать отображение графиков используя wpf

224
система строительства, как в clash of clans в unity

система строительства, как в clash of clans в unity

Как создать систему строительства на С# в Unity на подобии системы строительства, как в clash of clans? Нужно создать саму сетку строительства на которую...

253