我正在使用System.IO.FileSystemWatcher
在目录内的文件重命名上得到通知。这些文件是由不同进程创建的日志文件。与文件系统一起使用时的竞争状态
事件处理程序是这样的:
private async void FileRenamedHandler(object sender, RenamedEventArgs e)
{
//when file is renamed
//try to upload it to a storage
//if upload is succesful delete it from disk
}
一切看起来好到现在为止,但我需要补充的是,当该应用程序启动,以现有的日志文件上传到存储
通过目录遍历第二个方法所以
public async Task UploadAllFilesInDirectory()
{
foreach (var file in Directory.GetFiles(_directoryPath))
{
await TryUploadLogAsync(file);
}
}
问题是我进入比赛状态一样,例如:
文件刚刚被重命名并且FileRenamedHandler被触发,但同样的填充也会被
UploadAllFilesInDirectory
方法解析。在这一刻,我可能会上传两次相同的文件,或者当我试图从磁盘上删除它时,我会得到一个异常,因为它已被删除。我可以看到更多的竞争条件与此代码的情况。
任何想法如何我可以解决这个问题?
感谢
如果这是所有相同的过程,为什么你不能同步这两种方法? – devshorts
您可以指定哪些条件触发FileSystemWatcher,并删除重命名文件时激活的触发器。 – JConstantine