Создайте задержку в ASP. NET 3 - PullRequest
0 голосов
/ 11 июля 2020

Я застрял в ASP. NET 3, что означает, что я не могу использовать модель асинхронного программирования Task . В ASP. NET 4 вперед, я думаю, я могу просто безопасно сделать await Task.Delay(n).ConfigureAwait(false);, но здесь это не вариант.

Я хочу намеренно создать односекундную задержку перед ответом на ASP. NET, но я хочу убедиться, что влияю только на текущий запрос, а не задерживаю других пользователей. Пулы потоков и тому подобное никогда не были моей сильной стороной.

Если я использую Thread.Sleep(1000), он блокирует текущий поток - означает ли это только этот конкретный запрос? Или другие запросы потенциально в том же потоке и блокируются, особенно если есть приличная нагрузка трафика c?

Действует ли Task.Delay(1000).Wait() так же?

Я попадал в тупик в прошлом, делая такие вещи, чего я никогда не понимал, так может ли это вызвать тупиковые ситуации с другими запросами?

У меня есть два сценария ios:

Первый , только внутри действия контроллера:

public ActionResult DoSomething() {
    DoSomethingElse();
    Thread.Sleep(1000); // Or Task.Delay(1000).Wait() or whatever
    return something;
}

Мне также нужно, чтобы это было в отдельной задаче, которую я начинаю с действия контроллера, например, запустил и забыл, который я вызываю примерно так:

Task.Run(() => RunProcess(processID))
    .ContinueWith(task =>
        {
            if (task.IsFaulted) { /**/ } else { /**/ }
        }
});

void RunProcess(Guid processID) { 
    DoAnotherThing();
    Thread.Sleep(1000); // or Task.Delay(1000).Wait() or whatever else
}

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Thread.Sleep, вероятно, нормально. Но это зависит от вашей нагрузки и того, что делает остальная часть запроса.

ASP. NET действительно назначает отдельный поток для каждого запроса, поэтому, если вы спите на одном, это не повлияет на другие запросов.

Тем не менее, существует максимальное количество потоков. По умолчанию это 20 потоков на ядро ​​ЦП, но это можно настроить. См. maxWorkerThreads в элементе processModel (ASP. NET Схема настроек) документация.

Таким образом, вы столкнетесь с проблемами только в том случае, если у вас будет 20x [ваш CPU ядер] в секунду. Затем введение задержки в одну секунду в каждом запросе приведет к резервному копированию очереди запросов, если ваша нагрузка настолько высока.

Вам также придется учитывать, что делает остальная часть запроса. Если у вас 1 секунда сна + 1 секунда времени обработки, тогда у вас начнутся проблемы, если ваша нагрузка составляет 10x [ядер вашего процессора] в секунду. Поэтому стоит рассчитать, сколько времени займет весь запрос, если вы считаете, что ваша нагрузка может быть высокой.

Вы можете поднять значение maxWorkerThreads, если считаете, что у вас может быть проблема.

0 голосов
/ 11 июля 2020

Как вы упомянули функцию сна класса Thread, это именно то, что вам нужно, и он просто спит текущий поток на установленное вами количество времени, но в отношении выполнения tnet задач это другое и tnet получает thread и используйте его для других запросов, пока не истечет время задержки, затем один из потоков обработает остальную часть вашей функции. некоторые другие способы справиться с подобными проблемами работают, например, в ожидании ... Циклы, которые не подходят.

Сон потока: https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.sleep?view=netcore-3.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...