2013-10-31 54 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。