2008-09-08 4 views
8

asp.net에서 어떤 종류의 멀티 스레딩 문제를주의해야합니까?asp.net의 멀티 스레딩

+0

+1 좋은 질문 – Nick

+0

블로그에 게시 된 문제의 최종 블로그는 Phil Haacks입니다. http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks- in-asp-net.aspx/Quartz.NET 및 HangFire와 같은 백그라운드 프로세스를 실행하기위한 많은 프레임 워크가 있습니다. 90 초 제약 조건으로 살 수 있다면 QueueBackgroundWorkItem을 사용할 수도 있습니다. Azure, 웹 작업 또는 클라우드 서비스를 사용중인 경우 – RickAndMSFT

답변

0

프로그래밍 방식 캐싱은 즉시 내 마음에 드는 하나의 영역입니다. 신중하게 사용해야하는 훌륭한 기능입니다. 요청간에 공유되므로 요청을 업데이트하기 전에 잠금을 두어야합니다.

다른 곳에서는 로그 파일에 쓰는 것과 같은 파일 시스템에 액세스하는 코드가 있습니다. 한 요청에 파일에 대한 읽기 - 쓰기 잠금이 있으면 다른 동시 요청도 제대로 처리되지 않으면 오류가 발생합니다.

6

"fire and forget"작업을 위해 사용하는 경우 만료되는 항목 (예 : httpContext)에주의해야 할 사항 중 하나는 asp.net 정리 코드가 이전에 실행되면 갑자기 기억된다는 것입니다. 작업이 완료되면 특정 정보에 액세스 할 수 없습니다.

2

웹 서비스의 경우 스레드 풀링을 반드시 고려해야합니다. 스레드가 너무 많으면 결국 CPU 시간을두고 경쟁하기 때문에 응용 프로그램이 중단됩니다.

파일 또는 네트워크 IO입니까? 그렇다면 asynchronous IO도 고려해야합니다. 프로그램하는 데 약간의 고통이있을 수 있지만, 한 번에 너무 많은 스레드를 생성하는 것에 대해 걱정할 필요가 없습니다.

9

ASP.NET 페이지의 코드 숨김에서 스레드를 생성하는 것은 위험합니다. 작업자 프로세스가 때때로 재활용되어 스레드가 죽기 때문입니다.

웹 페이지에서 사용자 작업의 결과로 장기 실행 프로세스를 시작해야하는 경우 MSMQ에서 메시지를 삭제하고 큐를 모니터링하는 별도의 백그라운드 서비스를 유지하는 것이 가장 좋습니다. 이 서비스는 작업을 수행하는 데 오래 걸릴 수 있으며 웹 페이지는 거의 즉시 작업을 마칠 수 있습니다. 웹 메서드에 대한 asynch 호출을 사용하여 동일한 작업을 수행 할 수 있지만 웹 메서드가 끝났을 때 응답을받는 것에 의존하지 마십시오. 코드 숨김에서부터 빨리 불을 피워야합니다.

+1

StackOverflow에 대한 여러 질문에서이 기법을지지하는 것처럼 보였습니다. 예를 들어 청구 프로세스와 같이 장기 실행 프로세스로 이동하는 방법이라고 생각합니다. 공유 할 수있는 샘플 코드가 있습니까? 또는 binged에 키워드? – Salamander2007

+1

이 모든 것을 MSMQ로 구현하는 것보다 사용하기 쉬운 백그라운드 프로세스를 실행하기위한 많은 프레임 워크가 있습니다. 예를 들어, • Quartz.NET 및 HangFire. 90 초 제약 조건으로 살 수 있다면 QueueBackgroundWorkItem을 사용할 수도 있습니다. Azure, 웹 작업 또는 클라우드 서비스를 사용중인 경우 – RickAndMSFT

0

IIS 구성에 25 개의 총 스레드 제한이 있습니까? 적어도 IIS 6에서 나는 믿습니다. 그 한도를 초과하면 재미있는 일들이 생길 수 있습니다 (loooooooong 응답 시간).

0

멀티 스레딩과 관련하여 필요한 항목에 따라 클라이언트의 요청을 스폰한다고 생각해보십시오. AJAX를 사용하여 요청을 생성 한 다음 콜백 결과를 처리하는 것이 안전합니다. 또는 백 그라운드 메커니즘으로 서비스를 사용하십시오.이 메커니즘은 매 X 분마다 실행되며 그런 식으로 백그라운드에서 처리됩니다.