웹 응용 프로그램이 계속 실행되는 동안 새 스레드를 시작하여 데이터베이스를 쿼리하려고합니다. 나는 정상적인 웹 응용 프로그램 페이지주기가 진행되는 동안 스레드를 사용하여 쿼리 프로세스를 독립적으로 실행할 수 있다는 인상하에 있었지만 잘못된 것일 수 있습니다.웹 응용 프로그램이 계속 실행되는 동안 두 번째 스레드에서 데이터베이스를 쿼리하려면 어떻게합니까?
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 시간마다)으로 만 진행됩니다. 사용자는 분 데이터까지 가질 필요가 없으므로 시간이 좀 걸릴 수 있습니다. 가능한 경우 사이트가 완료되기를 기다리는 것을 원하지 않습니다.
스레드 풀에 대해 걱정할 필요가 없습니다. 아직 중요하지 않습니다. 기본 설정을 작동시켜야합니다. DB 업데이트 프로세스가 시작됩니까? 기본적으로 스레드를 작성하고, 작업이 완료되면 다시 호출하도록 작업 및 메소드를 수행 할 수 있도록 충분한 정보를 제공 한 다음 스레드를 시작해야합니다. 처음부터 앱에서 실행되도록 해보십시오. 위의 코드에는 기본 사항이 일부 있지만 코드가 누락되어 있습니다. – MonkeyWrench
사실이 부분은 두 부분입니다. 쿼리 및 다른 데이터베이스에 쓰기. 메서드 호출 DbUtil.MakeBillingDBMethod는 저장 프로 시저를 실행하는 루프를 사용하여 새 데이터베이스에 씁니다. WebServiceHandler.CallWebService() 메소드는 분명히 웹 서비스에서 오는 쿼리입니다. – Sean