2011-02-07 46 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类的新实例。

相关问题