【问题标题】:File IO within an ASP.NET MVC ActionASP.NET MVC 操作中的文件 IO
【发布时间】:2011-04-30 17:49:21
【问题描述】:

是否可以使用某种“关键部分”,以便在操作中安全地执行以下操作...

public ActionResult GenerateTasks()
{
    string someDir = ....

    if (!Directory.Exists(someDir))
    {
        Directory.CreateDirectory(someDir);
    }

    ...
}

【问题讨论】:

    标签: asp.net-mvc thread-safety action


    【解决方案1】:

    您只能通过使用系统范围的互斥锁来做到这一点。进程或应用程序域锁定原语在某些条件下(例如回收应用程序池时)将无法工作。

    但是,对于这里的特定情况,这不是必需的:Directory.CreateDirectory 已经实现了自己的存在检查,因此您不需要在这方面做任何事情。

    【讨论】:

      【解决方案2】:

      根据您的问题,我假设您感兴趣的并发安全性是目录是否在 Directory.ExistsDirectory.CreateDirectory 之间创建> 在不同的线程上。 (如果您担心 Directory.CreateDirectory 在目录已经存在时会引发异常,则不会。)如果是这样,这就是您的代码中可能发生的点然后,您可以简单地使用锁定对象来使这些操作集跨多个线程安全:

      private static object lockObject = new object();
      
      public ActionResult GenerateTasks()
      {
          string someDir = ....
      
          lock(lockObject)
          {
              if (!Directory.Exists(someDir))
              {
                  Directory.CreateDirectory(someDir);
              }
          }
          ...
      }
      

      但是,这不会使任何目录未与您的控制之外的交互(例如,在另一个应用程序进程中)发生交互的问题。

      【讨论】:

      • 那么,由于“lockObject”是静态的,我认为它会被所有同​​时发生的为该网站调用的此操作所共享?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多