【问题标题】:How long does a static member of a controller stay alive?控制器的静态成员能存活多久?
【发布时间】:2015-05-28 00:16:19
【问题描述】:

我在 ASP.NET 中有一个这样的控制器:

 public class FileUploadController : Controller
 { 
    // ...
    static List<ThreePartKey> uploadedFiles = new List<ThreePartKey> ();
    // ... 

    public ActionResult Index ( )
    {
       // ...
    }

    [HttpPost]
    public ActionResult Index (HttpPostedFileBase file, 
                               string selectedOrgName, 
                               string selectedCatName)
    {
        // ...
        uploadedFiles.Add(new ThreePartKey { 
             orgname = selectedOrgName, 
             catname = selectedCatName, 
             filename = fileNameNoExtension });

        ViewBag.uploadedFiles = uploadedFiles;
        return View();
    }
 }

第二个Index 函数上传用户选择的文件并将其信息添加到上传文件列表中。该列表信息用于构建 HTML 表格。我最终在List&lt;ThreePartKey&gt; uploadedFiles 前加上static 的原因是因为没有它,每次调用Index 时,我的列表将只有最后上传的文件。

该列表会在内存中保留多长时间?我希望它对应于用户sessions,但我不确定。

【问题讨论】:

  • 它应该在那里,直到 IIS 回收或重新加载应用程序域。它是静态的,所以如果我正确理解这些术语,那么垃圾收集器在正常操作期间永远不会清理它。
  • static 表示每个应用程序只有一个实例。在 IIS 中,这意味着每个 AppPool 一个实例。如果您尝试存储每个用户的信息,这是一个问题。为什么不直接使用Session

标签: c# asp.net asp.net-mvc session


【解决方案1】:

静态变量对于 AppDomain 是全局的,并且在 AppDomain 的生命周期内持续存在。在 ASP.NET 的情况下,该值不会是特定于用户的,并且基本上会一直存在,直到 Web 应用程序重新启动。

另外值得注意的是静态变量不一定是线程安全的,所以在操作变量时应该小心。在您的情况下, List 本质上不是线程安全的,因此您应该在代码中适应这一点(除非您将实现更改为使用会话变量或其他东西)。

【讨论】:

  • 请澄清这不是 ASP.NET 独有的,这就是静态变量在整个 .NET 中的工作方式。
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多