2016-05-18 4 views
1

У меня есть действие, которое возвращает только строку JSON с информацией.Является ли Task.Delay безопасным для использования в ASP.NET?

Чтобы запретить пользователям редактировать JS-код, который обновляет информацию каждые 2 секунды, мне также нужна задержка на стороне сервера, чтобы предотвратить высокую загрузку процессора.

Насколько безопасно использовать Task.Delay(2000), если есть (например) пользователи 2000-5000, выполняющие одинаковый запрос одновременно? Возвращаемая информация различна для каждого пользователя.

+0

Я не полностью понять, чего вы хотите достичь, но почему бы не использовать какую-то очередь и выполнить операцию по таймеру? –

+0

@ Константин Пешехонов IIS уже использует очереди, поддерживает дросселирование * и * кэширование результатов. Нет необходимости повторно изобретать их –

+0

@AlekPsk, что вы описываете, не является высокой нагрузкой на запрос. У HTTP, IIS и ASP.NET есть способы обработки ответов на кеширование. Вы можете использовать кэширование вывода для индивидуальных ответов пользователей, например, с небольшим таймаутом в 2 секунды.Вы можете указать соответствующие заголовки, чтобы сам IIS возвращал кешированный ответ (например, ETag, Expires). Вы можете изменить свой клиент так, чтобы он запрашивал только версии обновлений с заголовком 'If-Modified-Since' или' If-None-Match' и последним ETag –

ответ

2

Task.Delay абсолютно безопасен в использовании, так как он не требует создания или блокировки потоков или не останавливает процессор.

С другой стороны, он не поможет вам, так как по-прежнему можно выполнять несколько запросов с одной машины. Отсрочка выполнения без дополнительных проверок - это бесполезный способ дросселирования запросов.

1

Если речь идет о Task.Delay, то да, это нормально. Task.Delay приводит к задаче с таймером, который будет продолжен с этой задачей, когда это будет сделано (в обратном вызове таймера). Учитывая то, как он работает, это не блокирует поток и не выполняется в другом потоке, поэтому кажется, что все в порядке. Количество запросов, которые вы отправили, также не очень велико.

Это правда, однако, что мой ответ больше связан с использованием Task.Delay в ASP.NET MVC, чем в вашем конкретном сценарии, который вам нужно будет описать подробно, если вам нужен более конкретный ответ.

2

Почему, на ваш взгляд, добавление Task.Delay(2000) уменьшит нагрузку на процессор? Если у вас высокая загрузка процессора при T, добавление Task.Delay(2000) только откладывает высокую загрузку процессора на T + 2, что совершенно беспомощно.

Быстрое решение проверяет частоту отправки на стороне пользовательского интерфейса, например, на веб-странице, отключает кнопку отправки и включает ее через несколько секунд. Но это можно обмануть, поскольку интерфейсные скрипты могут быть изменены.

Более безопасное решение проверяет частоту отправки на стороне сервера, вы записываете последнее время отправки где-нибудь (например, статическую переменную, самое простое) и отклоняете недействительные запросы.

0

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

Так что, если вы используете, что задержка с сессии, вы блокируете все пользователи ... Пожалуйста, прочитайте о:

Does ASP.NET Web Forms prevent a double click submission?
Web app blocked while processing another web app on sharing same session
What perfmon counters are useful for identifying ASP.NET bottlenecks?
Replacing ASP.Net's session entirely
Trying to make Web Method Asynchronous

Смежные вопросы