当方法的新实例正在运行c#时,以前的方法仍在向文本文件写入数据

本文关键字:方法 文件 数据 文本 新实例 实例 运行 | 更新日期: 2023-09-27 18:18:04

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

代码片段:

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

当方法的新实例正在运行c#时,以前的方法仍在向文本文件写入数据

你可以实现某种锁

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");
             }
         }
     }

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

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);

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