2011-02-07 67 views
4

好吧,今天過了漫長的一天,我只是在尋找專家的意見。ASPX代碼隱藏頁面的線程安全

比方說,我這樣做:

public class ZipFiles : Page 
{ 
    Hashtable hs; 

與啓動,這意味着我必須在這個類的成員變量。

然後我行我呼籲在onload,如:

    ManagedFile mf = new ManagedFile(site); 
       mf.ID = docID; 
       mf.Load(); 
       hs.Add(Path.GetFileName(mf.URL), mf); 

還好,最後我從DotNetZip一個WriteDelegate方法做這個:

 private void WriteEntry(String filename, Stream output) 
    { 
     ManagedFile value = (ManagedFile)hs[filename]; 
     using (MemoryStream ms = new MemoryStream(value.GetBinary())) 
     { 
      ms.WriteTo(output); 
     } 
    } 

你可以看到,在onload我將所有mf對象放入散列表中,FileName作爲它們的關鍵字(永遠不會有2個相同的文件名),然後在WriteDelegate中彈出它們以獲取MF對象後面的Byte []數組。

這是災難的收件人嗎?我們網站上來自不同用戶的哈希表是否會混雜在一起,宇宙的聯繫是否分裂?

感謝您的幫助!現在是5點09分,我完成了一天的工作。晚飯時,妻子正在製作雞尾酒。他們很棒,如果你願意的話,可以要求收件人。另外,她還有我們的兩個男孩(6歲和4歲),這是自上週一以來首次回到學校。今晚5:40後滾進來的話,會有2個累了的男孩和1個累了的媽媽!

+1

除了下面的答案....我會採取該配方請。 :) – asawyer 2011-02-07 22:22:34

回答

1

每次訪問頁面加載都會導致哈希表被重新創建。這不是線程安全方面的災難處理方法,但它是性能方面的災難處方。你可能想創建一個線程安全的單例來管理這個散列表。

+0

有可能提供更多關於如何解決這個問題的細節?或者,也許指向我的鏈接?我在這方面都很新穎,而且它在我腦海中旋轉。 – 2011-02-08 13:39:16

4

由於您的HashTable變量不是靜態的,您不應該遇到任何線程問題。每個頁面請求將使用其自己的數據生成您的ZipFiles類的新實例。

相關問題