我正在使用 aSystem.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
方法解析。在这一刻,我可能会两次上传同一个文件,否则在尝试从磁盘中删除它时会出现异常,因为它已经被删除了。我可以使用此代码查看更多竞争条件案例。
知道我该如何解决这个问题吗?
谢谢