2013-10-31 69 views
2

在我的web应用程序中发生了一些奇怪的事情。我有我用简单的持有对象的集合持有两个变量的静态词典:时间流逝时丢失键值对的字典

static Dictionary<string, linkButtonObject> linkButtonDictonary = new Dictionary<string, linkButtonObject>(); 

我跟了LinkBut​​ton一个gridview,大约每一个数据与它在字典button.UniqueId相关:

protected void hoursReportGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e) 
{ 
    LinkButton btn = (LinkButton)e.Row.FindControl("taskLinkButton"); 
    linkButtonObject currentRow = new linkButtonObject(); 
    currentRow.storyNumber = e.Row.Cells[3].Text; 
    currentRow.TaskName = e.Row.Cells[5].Text; 
    linkButtonDictonary.Add(btn.UniqueID, currentRow); 
} 

然后当LinkBut​​ton的点击我拉查找在使用唯一ID的字典中​​的值,在SQL查询中使用它们,并使用检索到的数据来填充一个gridview,标签,并显示一个弹出:

protected void taskLinkButton_Click(object sender, EventArgs e) 
{ 
    //create linkbutton object from sender 
    LinkButton btn = (LinkButton)sender; 
    //get a list of data relevant to column 
    string[] infoData = getInfoData(linkButtonDictonary[btn.UniqueID].storyNumber, 
     linkButtonDictonary[btn.UniqueID].TaskName); 
    //assign content of list to labels and gridview 
    productDatabaseLabel.Text = infoData[0]; 
    storyNumberDatabaseLabel.Text = infoData[1]; 
    taskDatabaseLabel.Text = infoData[2]; 
    pointPersonDatabaseLabel.Text = infoData[3]; 
    SqlDataSource6.SelectParameters["storynumber"].DefaultValue = linkButtonDictonary[btn.UniqueID].storyNumber; 
    SqlDataSource6.SelectParameters["tasktitle"].DefaultValue = linkButtonDictonary[btn.UniqueID].TaskName; 
    infoGridView.DataBind(); 
    //show popup 
    MPE.Show(); 
} 

这一切都很好,我可以点击任何链接按钮,他们正确地创建和填充弹出并显示它。

我的问题是,如果我离开这个页面闲置不用几minuites然后单击一个LinkBut​​ton我得到的错误:

enter image description here

什么我做错了,我该如何解决?

+0

为什么字典被声明为静态?如果您删除了静态修饰符,是否会发生此问题? –

+0

如果我删除静态我每次都会得到异常。 –

+0

它有什么特殊之处? KeyNotFound或null? –

回答

5

每次AppDomain结束时都会丢失静态数据,它会不时执行,例如,当IIS决定回收您的工作进程时。

看到这个从谁能解释得比我好得多! Lifetime of ASP.NET Static Variable

您需要寻找一种替代数据存储模式。静力学不是你想要实现的目标。

1

您可以将调试器附加到您的网站,或添加一些诊断代码?发生异常时字典的内容是什么?

我的猜测是,按钮的UniqueID不是恒定的,字典中仍然包含您的数据,但ID不再匹配。或者,也许流程/ appdomain被回收,并且字典以某种方式被清空。

0

这也发生在我身上。如果您只查看临时存储空间。创建您自己的KeyValuePair类,然后将其放入List<>object[ ]

class Tupol 
    { 
     public Tupol() { } 
     public Tupol(string key,string value) { } 
     public string Key { get; set; } 
     public string Value { get; set; } 
    } 

初始化:

List<Tupol> temp = new List<Tupol>(); 

获得价值:

foreach(Tupol in temp) 
{ if(temp.Key == "foo") { Debug.WriteLine(temp.Value); break; } } 

在这种情况下我选择我的两个 “重点” 和 “价值” 对作为字符串。 (This will for me。