2012-04-07 350 views
0

正如您在下面看到的,我有Parallel.For循环。如果在文件不存在的情况下运行程序,则会出现错误,如“进程无法访问文件'C:\ ShowTime Error Logs \ logFile.txt',因为它正在被另一个进程使用。”如何解决“进程无法访问该文件,因为它正在被另一个进程使用”错误

但是,如果文件存在没有错误。我很困惑,即使文件不存在,我的代码也已经创建了文件。为什么在运行程序之前,如果文件不存在,它会给我一个错误。我该如何解决它?

THX

ErrorLog el = new ErrorLog(); 
     Parallel.For(0, 100000, delegate(int i) 
    { 
     el.WriteToShowTimeLog("logFile", "", "", (i).ToString(), "", "", @"C:\"); 
    }); 

错误日志类具有可变

private static readonly object lock_ = new object(); 
    public void WriteToShowTimeLog(string fileName, string errorMessage, string description, string movieID, string theaterID, string showTimeDate, string folderPath) 
    { 
     string filePath = folderPath + @"\ShowTime Error Logs\" + fileName + ".txt"; 
     lock (lock_) 
     { 

      if (!Directory.Exists(folderPath + @"\ShowTime Error Logs")) 
      { 
       Directory.CreateDirectory(folderPath + @"\ShowTime Error Logs"); 
      } 

      if (!File.Exists(filePath)) 
      { 
       File.Create(filePath); 
      } 

      using (StreamWriter dosya = new StreamWriter(filePath,true)) 
      { 

       dosya.WriteLine("TheaterID:  " + theaterID); 
       dosya.WriteLine("MovieID:   " + movieID); 
       dosya.WriteLine("Show Time Date: " + showTimeDate); 
       dosya.WriteLine("Hata Mesajı:  " + errorMessage); 
       dosya.WriteLine("Açıklama:   " + description); 
       dosya.WriteLine("Hata Alınan Zaman:" + DateTime.Now); 
       dosya.WriteLine("-------------------------------------------------------------------------------------------------------"); 
       dosya.Close(); 


      } 
     } 
    } 

回答

2

您需要在文件中包括锁检查,并建立一个功能和静态的,否则,你可以从两个单独的线程同时创建,产生你看到的错误。

编辑

File.Create返回一个打开的文件。然后StreamWriter尝试再次打开它。您可能应该简单地设置Streamwriter的设置选项,而不是尝试创建它,然后为StreamWriter重新创建它。

+0

我已经尝试过,但结果是一样的,我也尝试检查和创建文件之前并行for循环。 – Bilgehan 2012-04-07 16:59:42

+0

@Bilgehan:向我们展示修改后的代码,以便我们可以看到发生了什么问题。 – 2012-04-07 17:02:17

+0

我已编辑代码。谢谢 – Bilgehan 2012-04-07 17:08:04

1

锁外的任何东西都可以以任何线程的任何顺序运行。不要做出相反的假设。在这种情况下,您可能让线程#1检查文件是否存在。由于它没有,它进入if子句并且线程#2接管。线程#2检查文件是否存在。由于它不是,线程#2进入if子句并创建文件。一旦线程#1再次接管,惊喜!文件已经被创建,即使它已经“检查”它不存在。

大多数输出​​流将自动创建数据流入的文件,因此可能不需要拥有该部分。

+0

+1这里是[链接](http://msdn.microsoft.com/en-us/library/36b035cb.aspx)支持最后的声明 – 2012-04-07 16:58:05

+0

@尼尔我修改了代码,但它是相同的。谢谢 – Bilgehan 2012-04-07 17:32:13

相关问题