是什么导致我的线程两次调用存储过程?

时间:2016-03-10 02:25:07

标签: c# asp.net sql-server multithreading stored-procedures

我的代码看到了一个非常奇怪的问题。

这是线程创建代码(在Home.aspx.cs中)

WindowsIdentity current_identity = WindowsIdentity.GetCurrent();
HttpContext ctx = HttpContext.Current;

Thread worker = new Thread(delegate()
{
    WindowsImpersonationContext context = current_identity.Impersonate();
    HttpContext.Current = ctx;
    MyClass.MyMethod();
    context.Undo();
});
worker.CurrentCulture = Thread.CurrentThread.CurrentCulture;
worker.IsBackground = true;
worker.Start();

在MyClass.aspx.cs中,我有线程调用的方法:

public static void MyMethod()
{
    if (cache["MyList"] == null)
    {
        cache["MyList"] = MyList.Get();
    }
}

缓存是我们创建的Dictionary<string, object>,位于HttpContext.Current.Session。 MyList.Get()基本上是一个工厂方法,最终调用存储过程用数据填充MyList。

在MyClass.aspx.cs中,我还有一个属性:

public static MyList MyList
{
    get
    {
        if (cache["MyList"]) == null) // Breakpoint here
        {
             cache["MyList"] = MyList.Get();
        }
        return cache["MyList] as MyList;
    }
}

当我导航到Home.aspx.cs时,会创建工作线程并调用MyClass.MyMethod来调用存储过程。我使用SQL事件探查器确保存储过程确实执行。接下来,我导航到MyClass.aspx.cs页面。现在,我在属性MyList的getter中设置的断点被击中。我查看缓存,它只包含3个项目,但它不包含带有“MyList”键的条目。

奇怪的是,也许30秒后到一分钟,缓存会神奇地拥有4个项目。我查看SQL分析器,并再次执行相同的存储过程。

我的问题是:

  1. 什么导致缓存不再具有“MyList”键的条目,直到很久以后?是因为线程还没有完成?

  2. 导致我的存储过程第二次运行的原因是什么?

0 个答案:

没有答案