private async Task TryUntilTimeout(Action action, int timeout) {
DateTime StartTime = DateTime.Now;
while (true) {
try {
await Task.Run(action);
return;
} catch {
if ((DateTime.Now - StartTime).TotalMilliseconds > timeout)
throw;
}
await Task.Delay(500);
}
}