2010-08-16 2 views
1

내 환경 - C# 3.5 및 ASP.NET 4.0 및 VS 2010ASP.NET 스레딩 - 비동기 메서드를 수행 할 수 있습니까? 아니면 스레딩을 사용할 수 있습니까?

사과는 - 스레딩 및 비동기 방식과 관련된 몇 가지 개념에 조금 새로운입니다.

내 시나리오는 이것이다 :

    주기적으로 외부 사이트에 GET/게시물의 몇 가지를 확인하고 일부 데이터를
  1. 이 데이터를 수집합니다 내 사이트가 중앙 캐시에 캐시됩니다
  2. 주기적 조치는 약 5 분 안에 한 번 발생하며 내 사이트에 등록한 모든 신입 회원에게 발생합니다. 특정 조건에 따라 회원에 대한 쿼리가 중단됩니다.
  3. 사용자는 정기적 인 쿼리를 위해 로그인 할 필요가 없습니다. 사이트에 등록한 다음 비동기 코드를 해제하면 계속 작동합니다. 특정 트리거 조건에 따라 전자 메일을 통해 사용자가 한 번씩 따라서 기본적으로 사용자가 명시 적으로 로그인했는지 여부에 관계없이 모두 백그라운드에서 발생해야합니다.

로드 예상 - 나는 (정지/떠나 새 멤버 + 오래된 것들에 대한 회계) 하루에 약 100 총 실행 위원을 기대하고 있습니다. 나는 100 개 스레드 하루를 실행하고있어 각 '스레드'깨어 -

방정식 × 12 페치/시간 8 시간/일

내 마음에

는 X 패치 당 × 4 POST (100) 방문자/일입니다 ~ 5 분 안에 한 번 위로 몇 가지 물건을 않습니다. 스레드는 모든 스레드에서 공유되는 정적 중앙 캐시와 상호 작용합니다.

ThreadPools, AsyncPage 등에서 약간의 토론을 읽었습니다. 조금 새로운 영역입니다. 내 시나리오에서 당신은 무엇을 제안하겠습니까? 이렇게하는 것이 효율적인 방법은 무엇입니까?

답변을 사용하면 특정 클래스/방법/링크를 언급 해 주시면 감사하겠습니다. 무리 감사!

+0

체크 아웃 : [비동기 호출 대 스레딩] (http://izlooite.blogspot.com/2011/05/aspnet-async-calls-vs-threading.html) –

답변

3

ASP.net에서는 이와 같이 할 수 없으므로 안정성을 유지하면서 "스레드"를 유지할 수 없습니다. IIS는 언제든지 애플리케이션 풀 (I.E. 전체 프로세스)을 다시 시작하기로 결정할 수 있습니다. 실제로 필요한 것은 실행되고 요청하는 일종의 Windows 서비스입니다. 전화를 걸려면 HttpWebRequest.BeginGetResponse 메서드를 사용할 수 있습니다. 이것은 응답이 돌아 왔을 때 관련 위임을 해고하고 .net이 스레딩을 관리합니다.

+0

Windows 서비스가있는 벤은 옵션이 아닙니다. 나는 기본 호스팅 계획을 가지고 원격 호스트에서 이것을 호스팅하고있다. 스레드가 안정적 일 필요는 없으며 절대 정밀도가 필요하지 않습니다. 하지만 내가 필요로하는 것은 지속적인 모니터링입니다. 아무도 사이트에 로그온하지 않으면 어떤 종류의 백그라운드 처리를 실행할 수 없다는 말입니까? – Gerry

+0

ASP.net은 실제로 사용자가 설명하는 것에 적합하지 않습니다. 원격 호스트의 보안 설정이이를 허용하지 않는 경우 global.asax 내의 application_start 이벤트 처리기에서 일부 스레드를 실행 해 볼 수 있습니다. –

+0

벤, 당신의 대답은 '내 고객에게 정말로 중요한 기능입니다'라는 근본적인 측면에 대해 생각해 봤습니다. 그 대답은 실제로는 아닙니다. JS 인스턴스를 통해 설문 조사를하는 동안 브라우저 인스턴스를 열어 두도록 사용자에게 묻는 것은 90 % 괜찮습니다. 따라서 '환상적인 기능'에 대한 스레드를 사용하여 i를 지나치게 복잡하게 만드는 대신 간단하고 깔끔하고 강력한 솔루션을 고수 할 것입니다. 필요합니다. 고맙습니다. 먼저 질문에 답해 줘서 다행입니다. – Gerry

1

Ben과 동의하면 ASP.NET에서 IIS의 스레딩을 사용하지 않을 것입니다. 데스크톱 응용 프로그램에서 사용하는 것과 같지 않습니다.

어떤 종류의 폴링 또는 시간 제한 동작을 사용하려는 경우 백그라운드에서 실행할 요청을받을 수있는 처리기 (.ashx) 또는 asp.net 페이지 (aspx)를 사용하는 것이 좋습니다. XML 또는 JSON을 응답으로 리턴하십시오. 그런 다음 해당 URI에 대한 AJAX 요청을 수행하고 필요한 데이터를 얻도록 페이지의 일부 JavaScript를 설정할 수 있습니다. 해당 처리기는 필요한 서버 측 작업을 수행 할 수 있습니다. 이렇게하면 필요에 따라 백그라운드 프로세스를 실행하고 사용자의 프런트 엔드를 업데이트 할 수 있으며 현재 사용중인 트래픽에 맞게 확장 할 수있는 기존 IIS 스레드 풀을 활용할 수 있습니다.

그래서, 예를

ajaxRequest.ashx을 위해 : 프로세스 "배경"요청, HTTP POST/GET 매개 변수를 사용합니다.

myPage.aspx : 당신의 UI

someScript.js : myPage.aspx (또는 다른 페이지) 특정 작업이나 간격에서 ajaxRequest.ashx를 호출하는 기능을 자바 스크립트 파일 나오다.

jQuery.js : 모든 AJAX 코드 나 이벤트 핸들러 자신 :)

0

당신은 별도의 Windows 서비스 (또는 윈도우 스케줄러를 사용하여 실행하는 콘솔 응용 프로그램을 만들어야합니다을 쓸 필요가 없습니다)를 사용하여 원격 서버를 폴링합니다.

사이트와의 사용자 상호 작용을 기반으로 요청을 트리거해야하는 경우 가장 좋은 방법은 서비스가 모니터링하는 일종의 대기열 시스템 (예 : MSMQ)을 사용하는 것입니다.

+0

Geoff - 위의 Ben에 대한 내 의견을 참조하십시오. Windows 서비스 또는 앱은 옵션이 아닙니다. 감사. – Gerry