我正在使用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