【问题标题】:Thread saftey on a ASPX Codebehind pageASPX 代码隐藏页面上的线程安全
【发布时间】:2011-06-23 01:43:08
【问题描述】:

好的,今天已经很长了,我只是想征求专家的意见。

假设我正在这样做:

   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 个疲倦的妈妈!

【问题讨论】:

  • 除了以下答案之外......我会接受那个食谱。 :)

标签: asp.net thread-safety c#-2.0


【解决方案1】:

您应该不会遇到任何线程问题,因为您的 HashTable 变量不是静态的。每个页面请求都会使用自己的数据生成 ZipFiles 类的新实例。

【讨论】:

    【解决方案2】:

    每次访问页面加载都会导致重新创建哈希表。这不是线程安全方面的灾难,但它是性能方面的灾难。你可能想创建一个线程安全的单例来管理这个哈希表。

    【讨论】:

    • 能否提供更多关于如何实现这一目标的详细信息?或者也许指向我一个链接?我对此很陌生,我脑子里有点晕。
    • Hrmm 现在此页面获取 docID(s) 列表作为表单提交输入。如果我创建了一个 Singleton,这些表条目不会随着时间的推移而在表中累积,除非我在完成后清除那些我已经完成的条目?
    • @Paul,我不知道你的页面在做什么,看起来你每次都在构建相同的 HashSet。如果不是这种情况并且每个页面访问都需要一个唯一的哈希集,那么您的实现将起作用并且不会导致任何线程问题。
    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2012-09-27
    • 2020-01-17
    相关资源
    最近更新 更多