C# 当我的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() {

我想在web应用程序继续运行时启动一个新线程来查询数据库。我的印象是,通过使用线程,我可以在正常的web应用程序页面循环进行时独立运行查询过程,但我可能错了

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应用将不会运行。如果你想让它按时间表运行,控制好时间表,不要让点击网站的客户来触发

  • 单独的资源。由于此例程长期运行,因此请将它使用的资源与网站分开。使用控制台应用程序还可以在关闭时100%自动清理其使用的所有资源

  • 编程更简单。虽然一开始管理不同的产品听起来可能更复杂,但将它们分开并一次专注于一件事情实际上会简化开发

  • 运行到完成。ASP.NET辅助进程根据许多条件进行回收,包括设置的时间表,并且长时间运行的进程不会阻止它进行回收。如果它在进程运行时回收,进程将无法完成。将其与计划任务分离将确保无论ASP.NET工作进程状态或回收情况如何,都允许其运行到完成


  • 因为您的数据库进程是按计划运行的,所以请将其排除在web应用程序之外。创建执行此过程的控制台应用程序,并使用Windows的计划任务将其计划为每8小时运行一次

    将数据库过程和网站共有的代码放入共享dll中

    您希望将其分开的原因是:

  • 如果没有客户端,Web应用将不会运行。如果你想让它按时间表运行,控制好时间表,不要让点击网站的客户来触发

  • 单独的资源。由于此例程长期运行,因此请将它使用的资源与网站分开。使用控制台应用程序还可以在关闭时100%自动清理其使用的所有资源

  • 编程更简单。虽然一开始管理不同的产品听起来可能更复杂,但将它们分开并一次专注于一件事情实际上会简化开发

  • 运行到完成。ASP.NET辅助进程根据许多条件进行回收,包括设置的时间表,并且长时间运行的进程不会阻止它进行回收。如果它在进程运行时回收,进程将无法完成。将其与计划任务分离将确保无论ASP.NET工作进程状态或回收情况如何,都允许其运行到完成


  • 不要担心线程池。没关系。您需要让基本设置正常工作。什么启动数据库更新过程?基本上,您需要创建一个线程,为它提供足够的信息,以便它能够完成它的工作,并在完成后调用您的方法,然后启动该线程。首先,尝试在应用程序中单独运行。上面的代码中有一些基础知识,但也缺少一些代码。实际上,这有两个部分。查询,然后写入另一个数据库。方法调用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(); 
    }