diff --git a/RGB.NET.Core/RGBSurface.cs b/RGB.NET.Core/RGBSurface.cs
index 9528f78..74bc882 100644
--- a/RGB.NET.Core/RGBSurface.cs
+++ b/RGB.NET.Core/RGBSurface.cs
@@ -38,7 +38,14 @@ namespace RGB.NET.Core
///
/// Gets a readonly list containing all loaded .
///
- public IEnumerable Devices => new ReadOnlyCollection(_devices);
+ public IEnumerable Devices
+ {
+ get
+ {
+ lock (_devices)
+ return new ReadOnlyCollection(_devices);
+ }
+ }
///
/// Gets a readonly list containing all registered .
@@ -53,7 +60,14 @@ namespace RGB.NET.Core
///
/// Gets a list of all on this .
///
- public IEnumerable Leds => _devices.SelectMany(x => x);
+ public IEnumerable Leds
+ {
+ get
+ {
+ lock (_devices)
+ return _devices.SelectMany(x => x);
+ }
+ }
#endregion
@@ -92,32 +106,33 @@ namespace RGB.NET.Core
bool updateDevices = customData["updateDevices"] as bool? ?? true;
lock (_updateTriggers)
- {
- OnUpdating(updateTrigger, customData);
+ lock (_devices)
+ {
+ OnUpdating(updateTrigger, customData);
- if (syncBack)
- foreach (IRGBDevice device in Devices)
- if (device.UpdateMode.HasFlag(DeviceUpdateMode.SyncBack) && device.DeviceInfo.SupportsSyncBack)
- try { device.SyncBack(); }
- catch (Exception ex) { OnException(ex); }
+ if (syncBack)
+ foreach (IRGBDevice device in _devices)
+ if (device.UpdateMode.HasFlag(DeviceUpdateMode.SyncBack) && device.DeviceInfo.SupportsSyncBack)
+ try { device.SyncBack(); }
+ catch (Exception ex) { OnException(ex); }
- if (render)
- lock (_ledGroups)
- {
- // Render brushes
- foreach (ILedGroup ledGroup in _ledGroups.OrderBy(x => x.ZIndex))
- try { Render(ledGroup); }
- catch (Exception ex) { OnException(ex); }
- }
+ if (render)
+ lock (_ledGroups)
+ {
+ // Render brushes
+ foreach (ILedGroup ledGroup in _ledGroups.OrderBy(x => x.ZIndex))
+ try { Render(ledGroup); }
+ catch (Exception ex) { OnException(ex); }
+ }
- if (updateDevices)
- foreach (IRGBDevice device in Devices)
- if (!device.UpdateMode.HasFlag(DeviceUpdateMode.NoUpdate))
- try { device.Update(flushLeds); }
- catch (Exception ex) { OnException(ex); }
+ if (updateDevices)
+ foreach (IRGBDevice device in _devices)
+ if (!device.UpdateMode.HasFlag(DeviceUpdateMode.NoUpdate))
+ try { device.Update(flushLeds); }
+ catch (Exception ex) { OnException(ex); }
- OnUpdated();
- }
+ OnUpdated();
+ }
}
catch (Exception ex)
{
@@ -128,20 +143,19 @@ namespace RGB.NET.Core
///
public void Dispose()
{
- //if (_updateTokenSource?.IsCancellationRequested == false)
- // _updateTokenSource.Cancel();
+ lock (_devices)
+ foreach (IRGBDevice device in _devices)
+ try { device.Dispose(); }
+ catch { /* We do what we can */}
- foreach (IRGBDevice device in _devices)
- try { device.Dispose(); }
- catch { /* We do what we can */ }
-
- foreach (IRGBDeviceProvider deviceProvider in _deviceProvider)
- try { deviceProvider.Dispose(); }
- catch { /* We do what we can */ }
+ lock (_deviceProvider)
+ foreach (IRGBDeviceProvider deviceProvider in _deviceProvider)
+ try { deviceProvider.Dispose(); }
+ catch { /* We do what we can */}
foreach (IUpdateTrigger updateTrigger in _updateTriggers)
try { updateTrigger.Dispose(); }
- catch { /* We do what we can */ }
+ catch { /* We do what we can */}
_ledGroups.Clear();
_devices = null;
@@ -224,8 +238,11 @@ namespace RGB.NET.Core
private void UpdateSurfaceRectangle()
{
- Rectangle devicesRectangle = new Rectangle(_devices.Select(d => d.DeviceRectangle));
- SurfaceRectangle = SurfaceRectangle.SetSize(new Size(devicesRectangle.Location.X + devicesRectangle.Size.Width, devicesRectangle.Location.Y + devicesRectangle.Size.Height));
+ lock (_devices)
+ {
+ Rectangle devicesRectangle = new Rectangle(_devices.Select(d => d.DeviceRectangle));
+ SurfaceRectangle = SurfaceRectangle.SetSize(new Size(devicesRectangle.Location.X + devicesRectangle.Size.Width, devicesRectangle.Location.Y + devicesRectangle.Size.Height));
+ }
}
///
@@ -235,7 +252,10 @@ namespace RGB.NET.Core
/// A list of devices with the specified type.
public IList GetDevices()
where T : class
- => new ReadOnlyCollection(_devices.Select(x => x as T).Where(x => x != null).ToList());
+ {
+ lock (_devices)
+ return new ReadOnlyCollection(_devices.Select(x => x as T).Where(x => x != null).ToList());
+ }
///
/// Gets all devices of the specified .
@@ -243,7 +263,10 @@ namespace RGB.NET.Core
/// The of the devices to get.
/// a list of devices matching the specified .
public IList GetDevices(RGBDeviceType deviceType)
- => new ReadOnlyCollection(_devices.Where(d => deviceType.HasFlag(d.DeviceInfo.DeviceType)).ToList());
+ {
+ lock (_devices)
+ return new ReadOnlyCollection(_devices.Where(d => deviceType.HasFlag(d.DeviceInfo.DeviceType)).ToList());
+ }
///
/// Registers the provided .
diff --git a/RGB.NET.Core/RGBSurfaceDeviceLoader.cs b/RGB.NET.Core/RGBSurfaceDeviceLoader.cs
index f233282..df760c3 100644
--- a/RGB.NET.Core/RGBSurfaceDeviceLoader.cs
+++ b/RGB.NET.Core/RGBSurfaceDeviceLoader.cs
@@ -29,28 +29,31 @@ namespace RGB.NET.Core
/// Specifies whether exception during the initialization sequence should be thrown or not.
public void LoadDevices(IRGBDeviceProvider deviceProvider, RGBDeviceType loadFilter = RGBDeviceType.All, bool exclusiveAccessIfPossible = false, bool throwExceptions = false)
{
- if (_deviceProvider.Contains(deviceProvider) || _deviceProvider.Any(x => x.GetType() == deviceProvider.GetType())) return;
-
- List addedDevices = new List();
- if (deviceProvider.IsInitialized || deviceProvider.Initialize(loadFilter, exclusiveAccessIfPossible, throwExceptions))
+ lock (_deviceProvider)
{
- _deviceProvider.Add(deviceProvider);
+ if (_deviceProvider.Contains(deviceProvider) || _deviceProvider.Any(x => x.GetType() == deviceProvider.GetType())) return;
- foreach (IRGBDevice device in deviceProvider.Devices)
+ List addedDevices = new List();
+ if (deviceProvider.IsInitialized || deviceProvider.Initialize(loadFilter, exclusiveAccessIfPossible, throwExceptions))
{
- if (_devices.Contains(device)) continue;
+ _deviceProvider.Add(deviceProvider);
+ lock (_devices)
+ foreach (IRGBDevice device in deviceProvider.Devices)
+ {
+ if (_devices.Contains(device)) continue;
- addedDevices.Add(device);
+ addedDevices.Add(device);
- device.PropertyChanged += DeviceOnPropertyChanged;
- _devices.Add(device);
+ device.PropertyChanged += DeviceOnPropertyChanged;
+ _devices.Add(device);
+ }
}
- }
- if (addedDevices.Any())
- {
- UpdateSurfaceRectangle();
- SurfaceLayoutChanged?.Invoke(new SurfaceLayoutChangedEventArgs(addedDevices, true, false));
+ if (addedDevices.Any())
+ {
+ UpdateSurfaceRectangle();
+ SurfaceLayoutChanged?.Invoke(new SurfaceLayoutChangedEventArgs(addedDevices, true, false));
+ }
}
}