C# 当我的web应用程序继续运行时,如何在第二个线程上查询数据库?
我想在web应用程序继续运行时启动一个新线程来查询数据库。我的印象是,通过使用线程,我可以在正常的web应用程序页面循环进行时独立运行查询过程,但我可能错了C# 当我的web应用程序继续运行时,如何在第二个线程上查询数据库?,c#,asp.net,multithreading,web-services,C#,Asp.net,Multithreading,Web Services,我想在web应用程序继续运行时启动一个新线程来查询数据库。我的印象是,通过使用线程,我可以在正常的web应用程序页面循环进行时独立运行查询过程,但我可能错了 public class DbAsyncQuery { Dictionary<string, object> serviceResults = new Dictionary<string, object>(); public void UpdateBillingDB() {
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);
}
}
}
这是我的第一个网页之一,我是线程新手。我理解创建自己的线程和使用线程池之间有区别。我想,在这个方法中,我使用的是我自己的线程。不确定这是不是最好的办法
有什么想法吗?查询过程可以是完全独立的,它只会在预定的时间间隔(每8小时左右)发生。用户不需要最新的数据,因此可能需要一段时间。我只是不想让网站等待它完成,如果可能的话 因为您的数据库进程是按计划运行的,所以请将其排除在web应用程序之外。创建执行此过程的控制台应用程序,并使用Windows的计划任务将其计划为每8小时运行一次 将数据库过程和网站共有的代码放入共享dll中 您希望将其分开的原因是:
因为您的数据库进程是按计划运行的,所以请将其排除在web应用程序之外。创建执行此过程的控制台应用程序,并使用Windows的计划任务将其计划为每8小时运行一次 将数据库过程和网站共有的代码放入共享dll中 您希望将其分开的原因是:
不要担心线程池。没关系。您需要让基本设置正常工作。什么启动数据库更新过程?基本上,您需要创建一个线程,为它提供足够的信息,以便它能够完成它的工作,并在完成后调用您的方法,然后启动该线程。首先,尝试在应用程序中单独运行。上面的代码中有一些基础知识,但也缺少一些代码。实际上,这有两个部分。查询,然后写入另一个数据库。方法调用DbUtil.MakeBillingDBMethod使用运行存储过程的循环写入新数据库。WebServiceHandler.CallWebService()方法是执行查询的方法,查询显然来自web服务。不要担心线程池。没关系。您需要让基本设置正常工作。什么启动数据库更新过程?基本上,您需要创建一个线程,为它提供足够的信息,以便它能够完成它的工作,并在完成后调用您的方法,然后启动该线程。首先,尝试在应用程序中单独运行。上面的代码中有一些基础知识,但也缺少一些代码。实际上,这有两个部分。查询,然后写入另一个数据库。方法调用DbUtil.MakeBillingDBMethod使用运行存储过程的循环写入新数据库。WebServiceHandler.CallWebService()方法是执行查询的方法,它显然来自web服务。这实际上是我最初的计划。但是,我无法让我的控制台应用程序工作。查看此主题了解详细信息:在这种情况下,我希望它做的是随时有人登录,检查日志以查看上次更新的时间,如果是在8小时前,则查询此新线程。不过,如果我能让控制台应用程序正常工作,那也太好了。我同意塞缪尔的观点。这类事情应该在web应用程序之外进行,并按计划进行设置和/或在需要时也可以由web应用程序触发。@Sean,为什么需要web服务/WCF来完成这项工作?无论哪种方式,我都会坚持使用该解决方案,而不是使用Web应用程序。我还建议提供一个简单的例子,说明什么不起作用(对于另一个问题),这样人们就可以提供解决方案
protected void Application_Start(object sender, EventArgs e)
{
DbAsyncQuery query = new DbAsyncQuery();
query.UpdateBillingDB();
}