2012-09-22 3 views
0

Я читал этот блог Easy Background Tasks о системе пропусков некоторой страницы под названием StackOverflow: P, так, в комментарии говорится, что они закончили с сервисом, которые выполняют задачу, но, к примеру:Темы против Таймера против службы

Пользователь выполняет действия во времени T1 Это действие зависит от X числа пользователей по истечении времени Т2, вам необходимо выполнить некоторые дб запрос и уведомить пользователя (адрес электронной почты или любой другой)

Я говорю это потому, что реального опыта времени, поэтому вопрос здесь в том, что если вы используете потоки, скажем, у вас 1000 пользователей, которые выполняют действия, у вас будет 1000 ожидающих потоков, поэтому через какое-то время будет reci clyng, или если по какой-то причине отключается сервер, вы потеряете все эти задачи. Использование таймера закончится в той же ситуации

Если вы используете услугу, вы потеряете опыт реального времени, например, в онлайн-игре.

Итак, как бороться с такими вещами?

+3

Вы используете «фоновое задание» только тогда, когда время не критично. Конечно, случай для значков SO, никто не будет жаловаться, когда значок получает награду за минуту опоздания. Если для вас важно «реальное время», то не учитывайте фоновые задачи. И ** никогда не писать код, который создает тысячу ожидающих потоков. –

+0

Ну, я не буду жаловаться, если в следующий час будут отмечены значки. Таким образом, потоки не являются вариантом здесь, потому что мне нужно будет создать тысячу из них, так что вы предлагаете ?, Служба, которая проверяет этот час? –

ответ

3

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

Основываясь на вашем сценарии, сигнализация между потоками неэффективна, поскольку в потоковом потоке всегда имеется ограниченное количество доступных потоков. Однако, если вы знаете максимальное количество пользователей, которые будут удерживать поток (в зависимости от дизайна игры), вы можете использовать сигнализацию с использованием WaitHandles (AutoResetEvent и/или ManualResetEvent) для передачи сигналов между потоками. Но убедитесь, что вы увеличили количество доступных потоков в пуле в обработчик событий Application_Start в Global.asax

  int availableThreads; 

      int availablePorts; 

      ThreadPool.GetAvailableThreads(out availableThreads, out availablePorts); 

      ThreadPool.SetMinThreads(availableThreads, availablePorts); 

Надеетесь, что это помогает.

+0

Пул aad звучит как действительно хороший вариант, но мне нужно создать N потоков от каждого пользователя, поэтому мое число потоков будет представлять собой сумму потоков для каждого пользователя. Итак, как вы думаете, должен ли я использовать пул потоков? –

+0

Я предлагаю вам рассмотреть возможность добавления таймера и хеш-таблицы (для сбора пользовательских данных) каждому из ваших пользователей. Всегда есть ограничение в использовании потоков. Максимальное количество доступных потоков можно вычислить по этой формуле: Max_Available_Threads = 250 * [No_CPU_CORE], поэтому, если вы работаете на 12-ядерном процессоре, у вас будет до 3 000 доступных потоков. Поэтому, основываясь на этом количестве, использование потоков не подходит для большого числа пользователей в игре. – Houman

+0

Спасибо за ваш ответ;) –

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