문제

이 코드를 고려해보세요...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

이거 위험할 수도 있나요?사이트가 실행되는 동안 백그라운드에서 일부 작업을 수행하기 위해 애플리케이션에 타이머를 캐싱하는 것은 안전해 보이지만 이에 대한 경험이 있는 사람이 있는지 궁금합니다.

백그라운드에서 실행되도록 서비스를 작성하는 것이 확실히 훨씬 더 나을 것이라고 확신하지만 때로는 이것이 항상 선택 사항은 아닙니다.이것이 대안입니까?

도움이 되었습니까?

해결책

System.Threading.Timer는 ASP.Net과 마찬가지로 ThreadPool의 스레드를 사용하므로 이는 일반적으로 나쁜 생각입니다.

어떤 이유로 타이머 대리자가 차단되거나 중지되면 타이머는 시간 초과 기간 후에 새 스레드를 시작하여 ASP.net에서 사용할 수 있는 스레드를 소모합니다.

모두 차단되기 시작하면 사실상 더 이상 웹 요청을 처리할 수 없게 됩니다(아마도 나쁜 일입니다).

다른 팁

문제는 프로세스가 여전히 살아 있다는 보장이 없다는 것입니다.IIS는 기본적으로 원할 때마다 프로세스를 회수하므로 프로세스가 수행되지 않을 위험이 있습니다.

이 작업을 완료해야 하는 경우 웹 호출로 코딩하거나 서버 백그라운드에서 서비스가 실행되도록 해야 합니다.

작업자 프로세스가 재활용되거나 AppDomain이 충돌하고 작업 항목이 종료되어 수행 중이던 작업을 복구하려는 경우가 있을 수 있으므로 이는 위험할 수 있지만 불가능할 수 있습니다.

해당 작업 항목을 서비스로 가져올 수 있다면 Windows 서비스는 괜찮을 수 있습니다.작업에 HttpContext가 필요한 경우 Windows 서비스에서 웹 서비스를 호출하여 주기적으로 호출을 수행하도록 할 수 있지만 이상적이지는 않습니다.

말이 되지만 단지 재미를 위해 사이트가 종료되면 작업을 실행할 필요가 없다면 어떻게 될까요?Application_Start 이벤트와 연결되어 있고 사람들이 사이트를 탐색하는 동안에만 실행해야 한다면 그 시점에서 어떤 위험이 있습니까?

좋은 답변입니다. 내부에서 어떻게 작동하는지 조금 더 궁금합니다.

귀하의 사이트에서 페이지를 실행하기 위해 예약된 작업을 설정하는 것이 좋습니다.나는 일반적으로 다음을 사용하여 예약된 작업을 .vbs 파일로 지정합니다.

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing

Omar Al Zabir은 이러한 목적으로 캐시 항목 콜백을 사용하는 방법에 대한 훌륭한 게시물을 보유하고 있습니다.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top