2011-02-11 4 views
1

웹 응용 프로그램이 계속 실행되는 동안 새 스레드를 시작하여 데이터베이스를 쿼리하려고합니다. 나는 정상적인 웹 응용 프로그램 페이지주기가 진행되는 동안 스레드를 사용하여 쿼리 프로세스를 독립적으로 실행할 수 있다는 인상하에 있었지만 잘못된 것일 수 있습니다.웹 응용 프로그램이 계속 실행되는 동안 두 번째 스레드에서 데이터베이스를 쿼리하려면 어떻게합니까?

public class DbAsyncQuery 
{ 
    Dictionary<string, object> serviceResults = new Dictionary<string, object>(); 

    public void UpdateBillingDB() 
    { 
     QueryAllServices(); 

     foreach (KeyValuePair<string, object> p in serviceResults) 
     { 
      IEnumerable results = (IEnumerable)p.Value; 
      IEnumerable<object> sessions = results.Cast<object>(); 

      DbUtil.MakeBillingDBEntry(sessions, p.Key); 
     } 
    } 

    public static string[] servicesToQuery = new string[] // Must go in config file ultimately 
    { 
     "xxx.x.xxx.xx" 

    }; 

    public delegate void Worker(); 

    private Thread worker; 

    public void InitializeThread(Worker wrk) 
    { 
     worker = new Thread(new ThreadStart(wrk)); 
     worker.Start(); 
    } 

    public void InitializeQuery() 
    { 
     Worker worker = QueryAllServices; 
     InitializeThread(worker); 
    } 

    private void QueryAllServices() 
    { 
     Dictionary<string, DateTime> lastEntries = DbUtil.GetLastEntries(); 

     foreach (string ip in servicesToQuery) 
     { 
      string fullServicePath = 
       "http://" + ip + ":800/MyWebService.asmx"; 

      //object[] lastEntry = new object[] { lastEntries[ip] }; 
      object[] lastEntry = new object[] { new DateTime(2011, 1, 1, 0, 0, 0) }; 

      object obj = WebServiceHandler.CallWebService 
       (fullServicePath, "MyWebService", "GetBillingDBEntries", lastEntry); 

      serviceResults.Add(ip, obj); 
     } 
    } 
} 

기본적으로 실속 페이지를로드하기 전에 쿼리를 완료 기다려야 할 것 같다 (행 수천 될 수 있으므로 잠시 소요). 나는 Global.asax의 다음 섹션에 넣고 :

protected void Application_Start(object sender, EventArgs e) 
{ 
    DbAsyncQuery query = new DbAsyncQuery(); 
    query.UpdateBillingDB(); 
} 

이 내 첫 웹 페이지 중 하나이며, 내가 스레딩에 새로운 해요. 나 자신의 스레드를 생성하고 ThreadPool을 사용하는 것의 차이점을 이해합니다. 이 방법에서는 내 스레드를 사용하고 있다고 생각합니다. 그것이 최선의 방법인지 확실하지 않습니다.

아이디어가 있으십니까? 쿼리 프로세스는 완전히 독립적 일 수 있으며 예약 된 간격 (8 시간마다)으로 만 진행됩니다. 사용자는 분 데이터까지 가질 필요가 없으므로 시간이 좀 걸릴 수 있습니다. 가능한 경우 사이트가 완료되기를 기다리는 것을 원하지 않습니다.

+0

스레드 풀에 대해 걱정할 필요가 없습니다. 아직 중요하지 않습니다. 기본 설정을 작동시켜야합니다. DB 업데이트 프로세스가 시작됩니까? 기본적으로 스레드를 작성하고, 작업이 완료되면 다시 호출하도록 작업 및 메소드를 수행 할 수 있도록 충분한 정보를 제공 한 다음 스레드를 시작해야합니다. 처음부터 앱에서 실행되도록 해보십시오. 위의 코드에는 기본 사항이 일부 있지만 코드가 누락되어 있습니다. – MonkeyWrench

+0

사실이 부분은 두 부분입니다. 쿼리 및 다른 데이터베이스에 쓰기. 메서드 호출 DbUtil.MakeBillingDBMethod는 저장 프로 시저를 실행하는 루프를 사용하여 새 데이터베이스에 씁니다. WebServiceHandler.CallWebService() 메소드는 분명히 웹 서비스에서 오는 쿼리입니다. – Sean

답변

1

데이터베이스 프로세스가 일정에 따라 실행되므로 웹 응용 프로그램 외부에 보관하십시오. 이 프로세스를 수행하고 Windows의 예약 된 작업을 사용하여 8 시간마다 실행되도록 예약하는 콘솔 응용 프로그램을 만듭니다.

데이터베이스 프로 시저와 웹 사이트에 공통된 코드를 공유 dll에 넣습니다.

이 분리하려는 이유는 : 어떤 클라이언트가없는 경우

  1. 웹 응용 프로그램은 실행되지 않습니다. 이 일정을 일정에 따라 실행하려면 일정을 관리하고 클라이언트가 웹 사이트를 방문하여 실행되도록하십시오.

  2. 리소스를 따로 사용하십시오. 이 루틴은 장기간 실행되므로 웹 사이트와 별도로 사용하는 리소스를 보관하십시오. 콘솔 앱을 사용하면 닫을 때 자동으로 사용하는 모든 리소스를 100 % 정리합니다.

  3. 간단한 프로그램입니다. 별도의 제품을 관리하는 것이 처음에는 복잡해 보일 수도 있지만, 한 번에 하나씩 제품을 분리하고 집중하여 개발을 단순화합니다.

  4. 실행 완료. ASP.NET 작업자 프로세스는 설정된 일정을 비롯한 여러 조건을 기반으로 재생되며 장기 실행 프로세스에서는 재활용되지 않습니다. 프로세스가 실행 중일 때 재활용되면 프로세스가 완료되지 않습니다. 예약 된 작업으로 분리하면 ASP.NET 작업자 프로세스 상태 또는 재활용 여부에 관계없이 완료 될 때까지 실행할 수 있습니다.

+0

그건 사실 내 초기 계획 이었어. 그러나 나는 콘솔 앱을 작동시킬 수 없었다. 자세한 내용은 다음 항목을 참조하십시오. http://stackoverflow.com/questions/4961845/calling-web-services-dynamically-from-a-console-application/4961883#4961883 내가이 경우해야 할 일은 언제든지 8 시간 이상 지난 다음이 새로운 스레드에 대해 쿼리하는 경우 로그를 확인하여 마지막 업데이트시기를 확인합니다. 내가 콘솔 애플 리케이션을 얻을 수 있다면 그 역시 좋은 일이 되겠지. – Sean

+0

사무엘에 동의합니다. 이러한 종류의 작업은 웹 응용 프로그램 외부에서 수행되어야하며 일정에 따라 설정되어야합니다. 필요할 경우 웹 응용 프로그램에 의해 트리거 될 수 있습니다. –

+0

@Sean, 왜 이것을 수행하기 위해 WebService/WCF가 필요합니까? 어쨌든 웹 응용 프로그램을 사용하는 대신 그 해결책을 고수 할 것입니다. 나는 사람들이 해결책을 제공 할 수 있도록 (다른 질문을 위해) 효과가없는 것에 대한 간단한 예를 제시 할 것을 제안한다. –

관련 문제