【问题标题】:Creating database connection using a separate thread使用单独的线程创建数据库连接
【发布时间】:2015-04-09 07:25:39
【问题描述】:

您好,我有一个静态类,其中包含包含数据库数据的静态变量。我希望这些变量每 5 秒更新一次,所以我在同一个类中创建了一个线程,它将执行一个从数据库中获取数据并更新变量的函数。但我得到一个nullReferenceException 指向我声明初始化连接的行。 这是我的代码:

public static void Initialize()
    {
        if (!isInitialized)
        {
            isInitialized = true;
            Thread t = new Thread( new ThreadStart(SetProperties));
            t.Start();
        }
    }

    public static void SetProperties()
    {
        //The next line is where the NullReferenceException is pointing to
        OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + System.Web.HttpContext.Current.Server.MapPath("cms.accdb") + "';");

        using (conn)
        { ....

有什么帮助吗?谢谢

【问题讨论】:

  • 请求线程之外没有HttpContext.Current。说真的,你在做什么是愚蠢的。您需要重新考虑设计,ASP.NET 并不是真正适合做这种事情的环境。
  • @Luaan 嗨。感谢您的回复。但是您能否详细说明“请求线程之外没有 HttpContext.Current”?为什么你认为我在做的事情很傻?请指导我。我正在自学 ASP.net。
  • HttpContext.Current 是上下文相关的。它只会在请求线程上有一个值,并且您通过启动一个新线程来保留它(也就是说,您的 Initialize 方法在请求线程上运行,但 SetProperties 没有)。这会导致您的NullReferenceException,因为您正在尝试访问null 值的属性。缓存是计算中最难的事情之一,因此在尝试这方面的任何严肃事情之前,您可能需要了解更多信息。多线程是另一件最难的事情,在这里你作为初学者正在做这两项工作。坏主意:)

标签: c# asp.net multithreading


【解决方案1】:

在您的新线程中,您无权访问System.Web.HttpContext.Current 对象。 你可以替换

System.Web.HttpContext.Current.Server.MapPath("cms.accdb") 

HostingEnvironment.MapPath("cms.accdb") 

关于它的更多信息在这里: HostingEnvironment.MapPath

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多