以前的方法仍在将数据写入文本文件,而新方法的实例正在运行C#

时间:2011-12-17 16:46:04

标签: c# .net windows

我目前正面临一个问题,我有一个运行的方法,它查询服务器的特定端口并将结果写入名为temp.txt的文本文件。 Temp.txt永远不应该有任何重复的数据 - 文件应该在方法开始之前清除,虽然有时我发现该方法的前一个实例仍然在运行(因为它的异步)并且我经常得到重复的数据,因为另一个方法仍在写入文件/执行查询。

代码段:

            StreamWriter sw = File.AppendText("temp");
            sw.WriteLine("Check1=Success");
            sw.Close();

3 个答案:

答案 0 :(得分:2)

我更愿意改变方法。使用队列记录您需要更新文件。可能是MSMQ或内存队列,具体取决于您希望具有的容错级别。然后有一个单一的线程将该文件出列并更新文件,这样您就可以保证单次更新。这是发布 - 订阅模式的一种实现,具有许多发布者和单个订阅者。或者,您可以通过静态对象使用lock()来锁定文件访问权限。

答案 1 :(得分:2)

您可以实施某种lock

  

Lock确保一个线程不会进入关键部分   代码,而另一个线程在临界区。 如果是另一个   线程试图输入一个锁定的代码,它会等待,阻塞,直到   对象被释放。

  class OnlyOneCallerAllowed
    {     
       private static readonly object locker = new object();        
        public static void OnlyOneMethodCanWrite()
        {
           lock (locker)
            {
             using(StreamWriter sw = File.AppendText("temp"))
             {
               sw.WriteLine("Check1=Success");
             }

         }
     }

答案 2 :(得分:0)

StreamWriter sw = File.AppendText("temp");
sw.WriteLine("Check1=Success");
sw.Flush(); // <======
sw.Close(); 

修改

如何使用独占访问权限(FileShare.None)打开文件?

FileStream fs = new FileStream("temp", FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter sw = new StreamWriter(fs);

您还需要引入一些错误处理,因为如果另一个方法仍然打开文件,您将收到异常。