2014-04-09 2 views
4

Classic ASP/VBScript 응용 프로그램을 C#/ASP.Net로 변환하는 중입니다. 응용 프로그램의 VBScript 부분은 Windows Scheduler에서 개별 작업을 설정하고 매월 특정 날짜에 수행되는 일련의 개별 스크립트입니다. 일련의 Crystal Reports를 PDF 및 Excel로 내보내는 것뿐만 아니라 데이터베이스 삽입 (월별 기록 데이터 저장, 요약 청구 데이터 저장)을 포함한 약 35 개의 작업이 있습니다. 동시 작업으로 데이터베이스 서버를 압도하기 싫으므로 각 작업은 약 1 분 간격으로 예약됩니다.C# 예약 된 작업 시리즈

내가 C#에서이 접근법을 사용하는 이유는 VBScript를 사용하여 수행 한 별도의 스크립트 접근 방식이 아닌 하나의 응용 프로그램에서이 방법을 사용할 수 있을지 궁금합니다. 지난 1 년 동안 ASP.Net MVC로 응용 프로그램의 웹 사이트 부분을 변환하는 데 C# 사용에 익숙해졌지만 C#의 시간 제한 이벤트에 대한 경험이 없습니다. 나는 각 작업에 대해 별도의 기능을 만들어 각각의 작업 사이에 잠자기를하여 다음 작업으로 넘어 가기 전에 데이터베이스 처리를위한 충분한 시간을 허용함으로써이 문제에 접근하려고 생각했습니다. 다음과 같은 내용 :

p.DoTask1(); 
Thread.Sleep(60000); 
p.DoTask2(); 
Thread.Sleep(60000); 
p.DoTask3(); 
Thread.Sleep(60000); 
etc ... 

이 내용은 자체적으로 Windows 스케줄러에서 설정되는 콘솔 응용 프로그램으로 정리됩니다.

건전한 접근입니까? 더 나은 접근법이 있습니까? 나는 타이머와 과제에 관해 읽었지만, 그들이 성취하고자하는 것에 적절한지 확신 할 수 없다.

+0

@Amicable 내 애플리케이션이 데이터베이스 작업이 완료되었음을 알리거나 DB 서버에 작업을 전달했다는 것을 알 수 있습니까? 또한 수면을 수행하려면 실제로 작업을 사용해야합니까? 나는 수면이 가장 간단한 선택이라고 생각하고 있습니다. 저의 시나리오에서 좀 더 복잡한 선택을할만한 이유가 있습니까? –

+0

@Amicable 대부분의 db 작업은 꽤 빨리 끝납니다. 따라서 각 작업 사이에 잠깐 시간이 주어 지므로 시간이 많이 걸리지 만 그 부분이 중요하지는 않지만 그럼에도 불구하고 db 작업이 반환 된 레코드로 끝나는 시점을 알고 싶습니다. 다음 과제로 넘어 가기 –

+0

@Amicable 답안에 귀하의 의견을 요약해서 받아들입니까? 감사. –

답변

2

Task.ContinueWith을 사용하여 이전 작업이 완료된 후에 각 작업을 시작할 수 있습니다. 자세한 내용은 this related answer을 참조하십시오.

DB 쿼리는 영향을받은 행을 반환합니다. 데이터베이스에 전달한 쿼리를 실행하는 대신 데이터베이스에서 실행 한 쿼리의 실행이 완료되었음을 알리는 방식입니다.

단순히 스레드를 잠자는 것보다이 방법을 사용하면 얻을 수있는 이점은 여러 개의 작업을 한 번에 실행하지 않아도 작업간에 중단 시간이 없다는 것입니다.

당신이 더 중대한 통찰력을 가지고있는 당신의 상황에 얼마나 중요한가에 달려 있습니다.

1

Windows 스케줄러에서 실행되는 콘솔 앱이 나에게 좋습니다. 필자는 하루에 한 번 실행되는 데이터베이스 통합 프로그램에 대해이 작업을 직접 수행합니다. 는 시간 제한 이벤트의 경우,이 같은이 System.Threading.Timer 클래스를 사용

//here you set a time to start 
var timeToStart = 60000; 
//here an interval, if it's not recurring use Timeout.Infinite 
var tRefresh = Timeout.Infinite; 
//here the method, I make it static 
TimerCallback tcb1 = ClassName.MethodName; 
var timer = new System.Threading.Timer(tcb1, null, timeToStart, tRefresh); 

당신은 여러 개의 타이머를 생성하고, 문제를 해결하기 위해 다른 시작 시간과 함께, 그들에게 다른 작업을 할당 할 수 있습니다.

0

가치있는 것을 위해 이것을 실행하는 또 다른 제안. Windows에서 콘솔 앱을 실행하는 대신 Quartz.Net을 살펴볼 수 있습니다. 그러면 웹 사이트를 통해 작업 (또는 Quartz에서 작업)을 실행하고 별도의 콘솔 앱이 필요하지 않고 모든 코드를 한 번에 배포 및 업데이트 할 수 있습니다. CRON 타이밍 설정을 사용하여 스케줄링 할 수 있습니다. 사이트가 실행되어야하므로 홀수 시간에 실행하는 경우 모니터링 또는 핑 설정이 필요할 수 있습니다.

그런 다음 다른 일정으로 작업을 설정하거나 위에서 제안한 다른 작업과 마찬가지로 다른 작업이 완료 될 때 실행되는 작업이 하나 있습니다.

+0

@ user351952 웹 사이트가 복잡해지지 않도록 별도의 앱을 가지고있는 것이 좋으며, 성능에 대해 언급 한 것처럼 웹 사이트에서 스케줄러를 실행하는 데 안정성 문제가 있습니다. 어쨌든 Quartz.net을 살펴 보았고 콘솔 응용 프로그램에서 사용할 수 있으므로 Quartz.net과 .Net의 Task 클래스를 모두 고려하고 있습니다. Quartz.net이 .net 태스크 시스템보다 중요한 이점을 가지고 있다면 Quartz.net과 함께 갈 것이다. –