2015-04-05 88 views
0

根据:https://msdn.microsoft.com/en-us/library/system.io.streamwriter%28v=vs.110%29.aspx,“默认情况下,StreamWriter不是线程安全的,请参阅TextWriter.Synchronized for thread-safe wrapper。”所以我写了一个方法,并用于TextWriter.Synchronized同步我的StreamWriter对象:如何使用StreamWriter避免竞争条件

 static void GenerateData() 
    { 
     string fileName = Path.Combine(directory, "filenames.txt"); 

     using(StreamWriter names = new StreamWriter(fileName)) 
     { 
      // Synchronize access to names 
      TextWriter.Synchronized(names); 

      // Create 100,000 test files 
      // Take advantage of parallelism 
      Parallel.For(0, 100001, i => 
       { 
        // Generate name of test file 
        string curFile = Path.Combine(directory, String.Format("test{0}.txt", i + 1)); 

        // Store test file name in filenames.txt 
        names.WriteLine(curFile); 

        using(StreamWriter writer = new StreamWriter(curFile)) 
        { 
         // Take advantage of multiple cores 
         //TextWriter.Synchronized(writer); 

         // For 30 lines .. 
         for(int j = 0; j < 30; j++) 
         { 
          List<Rule> rules = new List<Rule>(); 

          // .. generate i rules 
          for(int k = 0; k < i; k++) 
          { 
           // Name of rule starts with r followed by random number in range [0, 9999] 
           string name = "r" + String.Format("{0}", random.Next(0, 10000)); 
           // Rule priority is in range [0, 500] 
           int pty = random.Next(1, 501); 
           rules.Add(new Rule(name, pty)); 
          } 

          // Write the list of rules to curFile 
          writer.WriteLine(String.Join(", ", rules.ToArray())); 
         }; 
        } 
       }); 
     } 
    } 

但是尽管这样,在输出文件(filenames.txt)一些行仍然可以得到错杂与他人。我想知道这是否可以修复而不诉诸在StreamWriter锁。

示例输出:

  1. C:\ Users \用户弗兰克·\文件\视觉工作室2013 \项目\ TimedAssignment3 \ TimedAssignment3 \数据集\ test1.txt的
  2. C:\ Users \用户弗兰克·\文件\视觉studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test50001.txt
  3. C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ tesal studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test37501.txt
  4. C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test87501.txt
  5. C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test12501.txt
+0

“混乱”是什么意思?你可以在写完文件后向我们显示'filenames.txt'的内容,所以我们知道你的意思吗? – reduckted 2015-04-05 05:17:21

+0

@ConstantCoder我已经添加了几行输出 – 2015-04-05 06:00:16

回答

2

使用返回TextWriter这样的:

var syncWriter = TextWriter.Synchronized(names); 

MSDN(https://msdn.microsoft.com/en-us/library/system.io.textwriter.synchronized(v=vs.110).aspx)说:

所有对返回包装的写操作都是线程安全的。你调用这个方法来确保一次只有一个线程可以执行返回的TextWriter实例上的方法 。

Synchronized()不使实例“同步”,但返回新的同步实例。

+0

谢谢,我没有仔细阅读! – 2015-04-05 06:28:49