Я правильно использую ThreadPool.QueueUserWorkItem?
Я работаю над приложением ASP.NET MVC. Я хотел порождать несколько потоков при возникновении события, мне не важно возвращаемое значение моих потоков, и я хотел сделать асинхронный вызов, поэтому я использую ThreadPool.QueueUserWorkItem,
public event SomeEventHandler SomeEvent;
private void SomeEventhappened(UserProfile arg)
{
SomeEventHandler handler = SomeEvent;
if (handler != null)
{
// handler(currentUser);
foreach (SomeEventHandler wc in handler.GetInvocationList())
{
SomeEventHandler wc2 = wc;
ThreadPool.QueueUserWorkItem(
delegate { wc2(arg); }
);
}
}
}
Я прикрепил функцию обработчика события к событию
Вот как я поднимаю событие,
this.SomeEventhappened(userProfile); //Here the event is raised
Весь приведенный выше код происходит в одном классе. Только функции-обработчики событий находятся в другом классе. Нужно ли убивать мои потоки после их завершения? Пожалуйста, предложите мне, если я делаю что-то не так.
3 ответа
Правильный способ использования ThreadPool
в приложении ASP.NET не использовать его. ASP.NET сам использует то же самое ThreadPool
поэтому, когда вы ставите рабочий элемент в очередь, вы забираете ресурсы, необходимые ASP.NET для обслуживания страниц.
Ради полноты добавлю, что "предпочтительной" альтернативой будет просто создать стандарт Thread
для работы. Вам придется кодировать метод работы более защищенно, так как пустой поток не имеет такой же уровень защиты, как ThreadPool
поток, но пока вы делаете это, то вы будете в безопасности и не будете каннибализировать запросы ASP.NET.
Если вы хотите запустить ваше событие асинхронно, вы можете просто вызвать BeginInvoke для каждого делегата. Нет необходимости ставить его в очередь как рабочий элемент.
Я думаю, что в ASP.NET MVC 2 есть AsyncController, который вы должны использовать вместо непосредственного использования ThreadPool,