public IActionResult GetDeviceScreenshotById(string id) { LogRequestToDebug(); var device = _devicesRepository.Find(id); if (device == null) { return(NotFoundExtension("Device not found in database.")); } if (device.Status == DeviceStatus.Offline || device.Status == DeviceStatus.FailedToInitialize || device.Status == DeviceStatus.LockedOffline) { try { return(_screenshotService.LoadScreenshotForOfflineDevice(device)); } catch (Exception e) { return(StatusCodeExtension(500, e.Message)); } } var start = DateTime.Now; while (ScreenshotLocked.Contains(device.Id)) { if (start + TimeSpan.FromMilliseconds(ScreenshotLockedTimeout) <= DateTime.Now) { throw new TimeoutException($"Too many requests for screenshots on device {device.Id}."); } Thread.Sleep(100); } ScreenshotLocked.Add(device.Id); try { switch (device.Type) { case DeviceType.IOS: return(_screenshotService.TakeScreenshotIosDevice(device)); case DeviceType.Android: return(_screenshotService.TakeScreenshotAndroidDevice(device)); case DeviceType.Unspecified: return(NotFoundExtension($"{device.Type} devices are not supported for screenshots.")); default: return(NotFoundExtension($"{device.Type} devices are not supported for screenshots.")); } } catch (Exception e) { return(StatusCodeExtension(500, e.Message)); } finally { ScreenshotLocked.Remove(device.Id); } }