2011-08-30 1 views
3

IIS에서 비동기 처리를 사용하고 싶습니다. 편집 : 나는 작업 병렬 라이브러리를 사용하는 방법에 대해 이야기하고있다.IIS에서 스레드를 사용하기위한 특별 고려 사항

예를 들어 특정 페이지를로드 할 때 많은 쓰레기를 로그하고 이메일을 보내고 일부 테이블을 업데이트하려고합니다.하지만 사용자가 모든 허위 기록을 기다리게 할 수는 없습니다.

정상적으로 내가하는 일은 정적 정보 대기열을 사용하여 로그 정보를 보낸 다음 OnLoad가 대기열을 플러시하는 10 분마다 특수 페이지를 호출하는 크론 작업을 수행하는 것입니다. 이 방법이 효과적이지만, 특히 50 가지를 기록하려는 경우에는 설치하기가 어렵습니다. 나는 이것을 다음과 같이하고 싶습니다.

Task.CreateNew(() => Log(theStuff)); 

그러나 IIS가 실행 중일 때마다 작업이 중단되고 전체 웹 사이트가 다운되기 때문에 겁나는 일이 있습니다.

그래서 지금은

SafeTask.FireAndForget(() => Log(theStuff)); 

이 일부 시도/캐치에 대리자를 래핑하고 Task.CreateNew로 전달합니다. 그래서 누군가가 실수로 태스크 스레드에 던져지는 예외를 생성하는 다른 것에 영향을주는 무언가를 변경하면 우리는 추락 한 웹 사이트 대신 알림을 받게됩니다. 또한 캐치 내부의 오류 알림도 자체 try/catch 내부에 있으며 캐치에는 try/catch가있어 다른 방식으로 로그인하려고합니다.

이제 안전하게 IIS에서 물건을 실행할 수 있습니다. 내 SafeTask 클래스를 사용하기 전에 걱정할 사항이 있습니까?

+0

IIS의 스레드를 사용할 때는주의하십시오. IIS는 이미 스레드를 사용하여 개별 요청을 처리하며 사용 가능한 총 수에 제한이 있습니다. –

+0

@joel 이걸로 새 스레드를 만들면 IIS의 한계를 없앨 수 있습니까? – dan

+0

IIS 제한이 아닌 OS 제한입니다. –

답변

1

IIS 및 .net의 모든 요청은 기본적으로 하나의 스레드에서 처리됩니다. 이 스레드는 "응용 프로그램 풀"이라는 스레드 풀에서 가져옵니다. 기존 스레드는 재사용되므로 매번 스레드를 지우거나 설정하지 않으면 실제로 스레드 상태로 사용할 수 없습니다. machine.config의 MSDN 또는 web.config의 수식을 사용하여이 스레드 풀의 크기를 정의합니다.

이제는 모든 비동기 함수 호출이 다른 스레드에 적용됩니다. 여기에는 비동기 웹 서비스 호출, 비동기 페이지 기능, 비동기 델리게이트 등이 포함됩니다.이 스레드는 "응용 프로그램 풀"에서 비롯되어 IIS가 새 요청을 처리 할 수있는 스레드 수를 줄입니다.

대부분의 경우 비동기 함수 호출을 사용하는 동안 응용 프로그램이 정상적으로 작동합니다. 혹시 비동기식 작업이 많다거나 걱정되는 경우 자신의 스레드 풀을 만들거나 codeplex에서 SmartThreadPool을 살펴볼 수 있습니다.

희망이 도움이됩니다.

+0

ThreadPool.QueueUserWorkItem 및 이와 동등한 것을 사용하는 대신 작업의 내부 대기열을 유지하고 스레드 수를 설정하는 TaskParallelLibrary를 사용하면 어떻습니까? – dan

+0

스레드는 항상 동일한 응용 프로그램 풀에서옵니다 - IIS의 응용 프로그램 풀에서 가져온 IIS 호스팅 된 응용 프로그램의 경우 자체 호스팅 또는 콘솔/Windows 응용 프로그램의 경우 기본적으로 .net을 통해 사용자가 만든 응용 프로그램 풀에서 가져옵니다. 이것은 스레드 풀이 프로세스와 연관되어 있기 때문입니다. 따라서 작업 병렬 라이브러리는 응용 프로그램과 동일한 스레드를 스레드 풀에서 사용합니다. – Nabheet

+0

감사합니다. 잘못된 정보를 가지고 Tasks에는 몇 개의 스레드로 제한된 자체 풀이 있다고 생각했습니다. – dan

1

페이지의 OnUnload 이벤트 사용을 고려하십시오. 여기에서 읽으십시오 : http://msdn.microsoft.com/en-us/library/ms178472.aspx

이 이벤트는 내용이 사용자에게 전송 된 후에 발생하므로 (사용자가 작업하는 동안 사용자가 차단되지 않으므로) 추가 스레드를 추가하지 않고도 완전히 만족해야합니다.

귀하의 질문과 관련하여,로드 및 성능 테스트에서 스레드 제한에 맞춰 실행 중이라고 제안하는 경우에만 스레드 풀 고갈에 대해 우려해야합니다. 당신이 아니라면 당신이 제안하는 것이 확실히 합리적입니다.

+0

흠, 흥미 롭습니다. 그러나이 많은 것들은 App_Code에서 많이 발생합니다. 나는 모든 로그 객체를 HttpContext Items 컬렉션에 추가 할 수 있다고 가정하지만이 작업에 사용할 수있는 페이지 언로드와 동일한 전역 객체가 있습니까? – dan