2008-09-22 4 views
4

예. 우리는이 코드 asp.net 양식 codebihind :asp.net 프로세스 내의 장기 실행 코드

private void btnSendEmails_OnClick() 
{ 
    Send100000EmailsAndWaitForReplies(); 
} 

이 코드 실행은 시간 초과 사유로 종료됩니다.

private void btnSendEmails_OnClick() 
{ 
    var taskId = AsyncTask.Run(() => Send100000EmailsAndWaitForReplies()); 
    // Store taskId for future task execution status checking. 
} 

을 그리고이 방법은 특별한 enveronment 내 W3wp.exe를 처리 이외의 몇 가지 방법을 실행됩니다 : 문제를 해결하기 위해 나는이 같은 것을보고 싶습니다.

누구든지 이런 종류의 문제를 해결하기위한 프레임 워크/도구 세트를 알고 있습니까?

업데이트 : 이메일 전송 방법은 내가 의미하는 것의 한 예일뿐입니다. 사실, 많은 기능을 asp.net 작업 프로세스 외부에서 실행해야 할 수 있습니다.

예. 이 점은 두 번째 타사 서비스의 데이터를 집계하고 함께 처리 한 다음 다른 서비스로 다시 보내는 응용 프로그램에서 매우 중요합니다.

+1

, 당신은 QueueBackgroundWorkItem를 사용할 수 있습니다. 다른 옵션으로는 HangFire, Web Jobs 및 Azure 클라우드 서비스가 있습니다. 자세한 내용은 내 대답을 참조하십시오. – RickAndMSFT

답변

3
  1. QueueBackgroundWorkItem 샘플은 이메일을 보내는 것으로 나타납니다.
  2. HangFire 오픈 소스 프로젝트는 공유 호스팅에서 작동합니다.
  3. Azure에서 WebJobs을 사용할 수 있습니다. 당신이 90 번째 제약 조건 내에서 살 수있는 경우 푸른에
  4. , Cloud services
0

하나의 옵션은 일정량의 전자 메일을 실행 한 다음 Response.Redirect를 다시 실행하고 모든 전자 메일을 보낼 때까지 반복하도록하는 것입니다.

나는 두 가지 경로를 생각할 수
1

나는 머리를 아래로 줄 :

  1. 당신은 원격 화 객체를 호스팅 Windows 서비스를 작성하고 방법은 외부 실행하도록 객체를 원격으로 웹 응용 프로그램 호출을 가질 수있다 IIS 프로세스 공간
  2. 요청을 기록 할 DB 또는 MSMQ를 설정할 수 있습니다. 그런 다음 웹 응용 프로그램은 요청의 상태를 모니터링하여 사용자에게 완료 사실을 알릴 수 있습니다. 나는 요청을 완성하는 서비스를 구상 할 것이다.
-3

Server.ScriptTimeout = 360000000;

0

메일을 서비스로 보내는 기능을 사용할 수 있습니다. 요청을 제출하고 처리하도록하십시오. 상태에 대해 한 번씩 쿼리하십시오. 서버를 제어 할 수 있다면 최적의 처리 및 수명 관리에 이상적인 Windows 서비스를 설치할 수 있습니다.

0

ASP.NET 2.0 이상에서는 비동기 페이지 개념을 지원합니다. 페이지 지시문 Async = "true"를 페이지에 추가하십시오.

Page_Load에서 BeginEventHandler 및 EndEventHandler 대리자를 사용하여 해당 "처리기"에서 비동기 적으로 코드를 실행합니다.

<%@ Page Language="C#" Async="true" %> 
<script runat="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    BeginEventHandler begin = new BeginEventHandler(BeginMethod); 
    EndEventHandler end = new EndEventHandler(EndMethod); 

    AddOnPreRenderCompleteAsync(begin, end); 
    } 
</script> 
5

이 다른 질문의 일환으로 논의되었습니다

Multithreading in asp.net

BackgroundWorker thread in ASP.NET

이 작업을 수행하는 좋은 방법은 없습니다. 완료되기 전에 재활용 될 수 있기 때문에 ASP.NET 작업자 프로세스에서 오래 실행되는 프로세스는 원하지 않습니다.

작동하는 백그라운드에서 실행되는 Windows 서비스를 작성하십시오.메시지를 MSMQ에 놓아 작업을 시작하십시오. 그러면 그들은 원하는만큼 실행할 수 있습니다.

+1

Windows 서비스가 내 비즈니스 개체를 어떻게 알 수 있습니까? – Ewerton

0

사이트가 공유 호스팅 공급자에 의해 호스팅 될 때 사용자 지정 Windows 서비스를 실행하는 것은 종종 불가능할 수 있습니다. IIS가 매순간마다 스레드를 재활용하는 경향이 있고 심지어 cofig 파일이나 코드를 통해 스크립트 실행 속성을 설정하는 것이 스레드를 재사용하지 않으므로 정기적 인 간격으로 실행되도록 별도의 스레드를 실행하면 일관성이 떨어질 수 있습니다 살해되고 재활용되지 않습니다.

공유 만료 서비스에서 사용할 수있는 방법이 가장 안전하고 일관성있는 옵션 일 수 있다는 점을 고려하여 캐시 만료 기반 방법을 사용하게되었습니다. 이 기사에서는 기사를 아주 잘 설명하고 문서 끝에있는 예약 된 작업을 관리하는 데 도움이되는 작업 대기열 클래스를 제공합니다. 여기를 참조하십시오. - http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

1

ASP.NET 호스팅 환경은 장기 실행 프로세스의 경우 매우 위험하므로, 갑작스러운 AppDomain 언로드가 발생할 수 있으므로 CPU 또는 I/O 소비.

요청 처리 파이프 라인 외부에서 백그라운드 작업을 수행하려는 경우 http://hangfire.io을 사용하십시오. 추가 Windows 서비스를 설치할 필요없이 백그라운드 처리의 모든 어려움과 위험을 처리합니다 (단, 때가 올 때). 어느 쪽이든은 mail sending tutorial입니다.

관련 문제