Allow CrossProcessFileBasedSemaphore to sleep asynchronously

This commit is contained in:
JustArchi
2020-05-21 23:08:02 +02:00
parent 0f1b3f05f9
commit a47b85ff85

View File

@@ -71,22 +71,22 @@ namespace ArchiSteamFarm.Helpers {
bool success = false;
try {
lock (LocalSemaphore) {
if (FileLock != null) {
throw new ArgumentNullException(nameof(FileLock));
}
while (true) {
try {
lock (LocalSemaphore) {
if (FileLock != null) {
throw new ArgumentNullException(nameof(FileLock));
}
while (true) {
EnsureFileExists();
EnsureFileExists();
try {
FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None);
success = true;
return;
} catch (IOException) {
Thread.Sleep(SpinLockDelay);
}
} catch (IOException) {
await Task.Delay(SpinLockDelay).ConfigureAwait(false);
}
}
} finally {
@@ -116,28 +116,34 @@ namespace ArchiSteamFarm.Helpers {
return false;
}
lock (LocalSemaphore) {
if (FileLock != null) {
throw new ArgumentNullException(nameof(FileLock));
}
try {
while (true) {
EnsureFileExists();
try {
FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None);
success = true;
lock (LocalSemaphore) {
if (FileLock != null) {
throw new ArgumentNullException(nameof(FileLock));
}
return true;
EnsureFileExists();
FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None);
success = true;
return true;
}
} catch (IOException) {
if (millisecondsTimeout <= SpinLockDelay) {
return false;
}
Thread.Sleep(SpinLockDelay);
await Task.Delay(SpinLockDelay).ConfigureAwait(false);
millisecondsTimeout -= SpinLockDelay;
}
}
} finally {
if (!success) {
LocalSemaphore.Release();
}
}
} finally {
if (!success) {