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

Добавить к ответу @BradWilson: "Вы могли также заставить своего поставщика управления исходным кодом обеспечивать исходное число пересмотра, если Вы хотите"

соединить Подрывную деятельность и MSBuild: Проект

Задач Сообщества MSBuild

5
задан Mike Two 29 October 2009 в 06:48
поделиться

2 ответа

Обновление: Несмотря на то, что вы указали в комментариях, что должны сделать это в Asp.Net, я оставлю свой исходный контент ниже, так как он содержит несколько полезных ссылок.

Поскольку Asp.Net использует пул потоков для планирования входящих запросов, выполнение фоновой задачи в пуле потоков приведет к отключению одного потока от него и повлияет на производительность Asp.Net. Таким образом, вам придется использовать класс Thread .

Для реализации вашего сценария вы можете создать новый экземпляр Thread , установив для его свойства IsBackground значение правда и запустить его. После запуска поток будет ждать события AutoResetEvent (с использованием метода WaitOne ), которое будет установлено входящим запросом (с использованием метода Set met6hod), который будет сигнализировать фоновому потоку, что его задача должна быть обработана. После завершения задачи фоновый поток снова будет ждать события.

Это простейшая реализация, которая не позволяет передавать параметры между запросом и фоновым потоком и не позволяет ставить в очередь более одной задачи. время. Если вам нужна поддержка параметров или очередей, вам нужно будет сохранить ссылку на объект потока где-нибудь, где он будет недоступен для входящих запросов.

Вам также придется учитывать, что ваш фоновый поток может быть остановлен в любой момент в время, если IIS решит перезапустить рабочий процесс Asp.Net. Кроме того, генерирование исключения внутри фонового потока заставит IIS перезапустить рабочий процесс Asp.Net.

Есть также некоторые соображения относительно идентификации фонового потока. В частности, фоновый поток может ' t легко олицетворять личность пользователя в текущем входящем запросе. Это возможно, но это потребует от вас передачи идентификатора пользователя каждый раз, когда новая задача планируется по запросу.


Было бы полезно, если бы вы сообщили нам, на каком языке и на какой платформе вы пишете свой код.

Если это платформа Windows, существует пул потоков, из которого вы можете «позаимствовать» потоки для своих задач. Вы можете запланировать выполнение задачи в пуле потоков с помощью API QueueUserWorkItem (C ++) или ThreadPool.QueueUserWorkItem (C # /. Net). Обратите внимание, что есть некоторые последствия , если ваша задача будет выполняться в течение более длительного времени.

Вы также можете создать свой собственный поток, используя либо класс Thread (C # /. Net), либо _beginthreadex или CreateThread API (C ++). В этом случае, вам нужно будет реализовать очередь для потока переднего плана, чтобы запланировать задачи, и у вас будет цикл в фоновом потоке, чтобы выбрать новые задачи и выполнить их. И, конечно же, вам придется синхронизировать доступ к этой очереди из обоих потоков, используя некоторый примитив синхронизации, такой как CRITICAL_SECTION (C ++) или оператор блокировки (C # /. Net).

Для Linux или OS X вы можете изучить потоки POSIX . Я не очень много программировал в стиле * nix, поэтому могут быть даже лучшие альтернативы. Если вы нацеливаетесь на одну из этих платформ, добавьте эту информацию в свой вопрос, и я уверен, что полезные ответы появятся в кратчайшие сроки.

вам нужно будет синхронизировать доступ к этой очереди из обоих потоков, используя некоторый примитив синхронизации, такой как CRITICAL_SECTION (C ++) или оператор блокировки (C # /. Net).

Для Linux или OS X вы можете изучить потоки POSIX . Я не очень много программировал в стиле * nix, поэтому могут быть даже лучшие альтернативы. Если вы нацеливаетесь на одну из этих платформ, добавьте эту информацию к своему вопросу, и я уверен, что полезные ответы появятся в кратчайшие сроки.

вам придется синхронизировать доступ к этой очереди из обоих потоков, используя некоторый примитив синхронизации, такой как CRITICAL_SECTION (C ++) или оператор блокировки (C # /. Net).

Для Linux или OS X вы можете изучить потоки POSIX . Я не очень много программировал в стиле * nix, поэтому могут быть даже лучшие альтернативы. Если вы нацеливаетесь на одну из этих платформ, добавьте эту информацию к своему вопросу, и я уверен, что полезные ответы появятся в кратчайшие сроки.

7
ответ дан 14 December 2019 в 08:54
поделиться

Создание потока обычно выполняется путем вызова специального примитива ( CreateThread () в Win32) и передачи ему функции входа. Этот код функции вызывается во вновь созданном потоке и может делать все, что пожелает - например, он может запускать цикл и просматривать задачи из заранее созданной очереди. Ваш основной поток может отправлять задачи в эту очередь, чтобы рабочий поток обрабатывал их. Когда в очереди нет задач, рабочий поток может просто заблокировать примитив синхронизации (например, событие), ожидая отправки новых задач.

0
ответ дан 14 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: