Skip to content

Commit c0d810b

Browse files
committed
Refactor CameraProvider: Improve camera refresh logic and ensure proper semaphore usage
1 parent 8953ce9 commit c0d810b

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

src/CommunityToolkit.Maui.Camera/Interfaces/ICameraProvider.shared.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public interface ICameraProvider
1414
/// List is initialized using <see cref="InitializeAsync"/>, and can be refreshed using <see cref="RefreshAvailableCameras(CancellationToken)"/>
1515
/// </remarks>
1616
IReadOnlyList<CameraInfo>? AvailableCameras { get; }
17-
17+
1818
/// <summary>
1919
/// Gets a value indicating whether the camera provider has been successfully initialized.
2020
/// </summary>

src/CommunityToolkit.Maui.Camera/Providers/CameraProvider.shared.cs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,42 @@ public void Dispose()
2525
GC.SuppressFinalize(this);
2626
}
2727

28+
Task GetRefreshTask(CancellationToken token)
29+
{
30+
if (refreshAvailableCamerasTask is null || refreshAvailableCamerasTask.IsCompleted)
31+
{
32+
refreshAvailableCamerasTask = PlatformRefreshAvailableCameras(token).AsTask();
33+
}
34+
35+
return refreshAvailableCamerasTask;
36+
}
37+
2838
/// <inheritdoc/>
2939
public async ValueTask InitializeAsync(CancellationToken token)
3040
{
31-
if (!IsInitialized)
41+
await refreshAvailableCamerasSemaphore.WaitAsync(token);
42+
43+
try
44+
{
45+
if (!IsInitialized)
46+
{
47+
await GetRefreshTask(token);
48+
}
49+
}
50+
finally
3251
{
33-
await RefreshAvailableCameras(token);
52+
refreshAvailableCamerasSemaphore.Release();
3453
}
3554
}
3655

3756
/// <inheritdoc/>
3857
public async Task RefreshAvailableCameras(CancellationToken token)
3958
{
4059
await refreshAvailableCamerasSemaphore.WaitAsync(token);
41-
60+
4261
try
4362
{
44-
if (refreshAvailableCamerasTask is null || refreshAvailableCamerasTask.IsCompleted)
45-
{
46-
refreshAvailableCamerasTask = PlatformRefreshAvailableCameras(token).AsTask();
47-
}
48-
49-
await refreshAvailableCamerasTask;
63+
await GetRefreshTask(token);
5064
}
5165
finally
5266
{
@@ -64,6 +78,6 @@ void Dispose(bool disposing)
6478
refreshAvailableCamerasTask = null;
6579
}
6680
}
67-
81+
6882
private partial ValueTask PlatformRefreshAvailableCameras(CancellationToken token);
6983
}

0 commit comments

Comments
 (0)