当方法的新实例正在运行c#时,以前的方法仍在向文本文件写入数据
本文关键字:方法 文件 数据 文本 新实例 实例 运行 | 更新日期: 2023-09-27 18:18:04
我目前面临一个问题,我有一个方法,我运行查询服务器的特定端口,并将结果写入一个名为temp.txt的文本文件。Temp.txt中不应该有任何重复的数据-在方法开始之前文件应该是清晰的,尽管有时我发现该方法的前一个实例仍在运行(作为其异步),并且我经常得到重复的数据,因为另一个方法仍在写入文件/执行查询。
代码片段:
StreamWriter sw = File.AppendText("temp");
sw.WriteLine("Check1=Success");
sw.Close();
你可以实现某种锁
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);
您还需要引入一些错误处理,因为如果其他方法仍然打开文件,您将得到一个异常。