Многопоточность в asp.net

Какие проблемы с многопоточностью нужно учитывать в asp.net?


person Larry Foulkrod    schedule 08.09.2008    source источник
comment
Подробный блог по проблемам (хотя и устаревший) - это Фил Хакс haacked.com/archive/2011/10/16/ Существует множество фреймворков для запуска фоновых процессов, таких как Quartz.NET и HangFire. Если вы можете жить с 90-секундным ограничением, вы даже можете использовать QueueBackgroundWorkItem. Если вы используете Azure, веб-работу или облачные сервисы.   -  person RickAndMSFT    schedule 20.08.2014


Ответы (6)


Создавать потоки из кода программной части страницы ASP.NET рискованно, потому что рабочий процесс будет время от времени перезапускаться, и ваш поток умрет.

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

person Eric Z Beard    schedule 08.09.2008
comment
Вы, кажется, отстаиваете эту технику в нескольких вопросах на StackOverflow, и я думаю, что это способ сделать длительный процесс, например, процесс выставления счетов. Есть ли какой-нибудь образец кода, которым вы можете поделиться? или ключевое слово для выпивки? - person Salamander2007; 29.07.2009
comment
Существует множество фреймворков для запуска фоновых процессов, которые намного проще использовать, чем реализовать все это с помощью MSMQ. Например, • Quartz.NET и HangFire. Если вы можете жить с 90-секундным ограничением, вы даже можете использовать QueueBackgroundWorkItem. Если вы используете Azure, веб-работу или облачные сервисы. - person RickAndMSFT; 20.08.2014

Одна вещь, на которую следует обратить внимание, когда истекает срок действия (я думаю, что httpContext делает), если вы используете его для операций, которые являются «выстрелил и забыл», помните, что внезапно, если код очистки asp.net запускается до того, как ваша операция будет выполнена , вы не сможете получить доступ к определенной информации.

person kemiller2002    schedule 08.09.2008

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

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

person Jason Baker    schedule 08.09.2008

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

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

person Gulzar Nazim    schedule 08.09.2008

Разве в конфигурации IIS нет ограничения в 25 общих потоков? По крайней мере, я верю в IIS 6. Если вы превысите этот предел, могут произойти интересные вещи (читайте: длительное время отклика).

person Michael Stum    schedule 08.09.2008

В зависимости от того, что вам нужно, что касается многопоточности, думали ли вы о создании запросов от клиента. Создавать запросы с помощью AJAX безопасно, а затем воздействовать на результаты в обратном вызове. Или используйте службу в качестве фонового механизма, который запускается каждые X минут и обрабатывается таким образом в фоновом режиме.

person Brian Mains    schedule 18.12.2014