我目前正面临一个问题,我有一个运行的方法,它查询服务器的特定端口并将结果写入名为temp.txt的文本文件。 Temp.txt永远不应该有任何重复的数据 - 文件应该在方法开始之前清除,虽然有时我发现该方法的前一个实例仍然在运行(因为它的异步)并且我经常得到重复的数据,因为另一个方法仍在写入文件/执行查询。
代码段:
StreamWriter sw = File.AppendText("temp");
sw.WriteLine("Check1=Success");
sw.Close();
答案 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);
您还需要引入一些错误处理,因为如果另一个方法仍然打开文件,您将收到异常。