2008-11-17 102 views
2

下面的代码只是一个简单的例子来说明我的问题:打开文件进行共享写

using System; 
using System.IO; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static string LogFile = @"C:\test.log"; 

     static void Main(string[] args) 
     { 
      for (int i = 0;i<10;i++) 
      { 
       new Thread(new ParameterizedThreadStart(DoWork)).Start(i); 
      } 
      Console.ReadKey(); 
     } 

     static void DoWork(object param) 
     { 
      int count = (int)param; 

      try 
      { 
       using (FileStream fs = new FileStream(LogFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) 
       using (StreamWriter sw = new StreamWriter(fs)) 
       { 
        sw.WriteLine(DateTime.Now + " - Start " + count.ToString()); 
        Thread.Sleep(2000); // simulate doing some work 
        sw.WriteLine(DateTime.Now + " - End " + count.ToString()); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(count.ToString() + ": " + e.Message); 
       return; 
      } 
      Console.WriteLine(count.ToString() + ": Done."); 
     } 
    } 
} 

这里的问题是,通常只有一个入口使其进入文件,即使我调用该方法10倍。该文件应该打开以允许共享。据我所知,没有例外被抛出。这是怎么回事?

在实际的代码,这个例子阴影,每次调用DoWork的实际上是一个独立的进程,但测试表明,其结果是,如果我可以修复它在这里我可以有解决它的same--。

回答

4

没有什么奇怪的事情在这里。想象一下,你有一个文件“a.txt”,你用记事本打开它10次。之后,您将更改文件的内容并将其保存在记事本的每个实例中。当然,最后一次保存是保存到文件中的,因为它重写了以前的9次保存。

我想你已经得到了相同的行为在这里。所有文件同时打开,因为每个处理中都有一个Thread.Sleep。所以我保存的i文件会覆盖前面的保存(i-1)。

编辑:尝试删除Thread.Sleep(2000),您将有更多的日志在文件中。

+0

当然这不奇怪:)我只是想考虑非奇怪的事情是怎么回事哪。这很有道理,谢谢。 – 2008-11-17 18:07:43

1

使用SyncLock这可以确保只有一个线程打开一次文件。 与此同时,其他进程不会崩溃,而是等待queue