diff --git a/AIDevGallery/Controls/SampleContainer.xaml.cs b/AIDevGallery/Controls/SampleContainer.xaml.cs index ccd2ac21..bb6b47c5 100644 --- a/AIDevGallery/Controls/SampleContainer.xaml.cs +++ b/AIDevGallery/Controls/SampleContainer.xaml.cs @@ -65,6 +65,7 @@ public List NugetPackageReferences private List? _modelsCache; private WinMlSampleOptions? _currentWinMlSampleOptions; private CancellationTokenSource? _sampleLoadingCts; + private readonly object _ctsLock = new object(); private TaskCompletionSource? _sampleLoadedCompletionSource; private double _codePaneWidth; private ModelType? _wcrApi; @@ -109,16 +110,19 @@ internal static async Task WaitUnloadAllAsync() private void CancelCTS() { - var cts = _sampleLoadingCts; - if (cts == null) + CancellationTokenSource? cts; + lock (_ctsLock) { - return; + cts = _sampleLoadingCts; + _sampleLoadingCts = null; } - _sampleLoadingCts = null; - using (cts) + if (cts != null) { - cts.Cancel(); + using (cts) + { + cts.Cancel(); + } } } @@ -220,9 +224,13 @@ public async Task LoadSampleAsync(Sample? sample, List? models, Wi return; } - _sampleLoadingCts?.Dispose(); - _sampleLoadingCts = new CancellationTokenSource(); - var token = _sampleLoadingCts.Token; + CancellationToken token; + lock (_ctsLock) + { + _sampleLoadingCts?.Dispose(); + _sampleLoadingCts = new CancellationTokenSource(); + token = _sampleLoadingCts.Token; + } // if WCR API, check if model is downloaded foreach (var wcrApi in models.Where(m => m.HardwareAccelerators.Contains(HardwareAccelerator.WCRAPI))) @@ -319,8 +327,11 @@ public async Task LoadSampleAsync(Sample? sample, List? models, Wi finally { _sampleLoadedCompletionSource = null; - _sampleLoadingCts?.Dispose(); - _sampleLoadingCts = null; + lock (_ctsLock) + { + _sampleLoadingCts?.Dispose(); + _sampleLoadingCts = null; + } } NavigatedToSampleLoadedEvent.Log(sample.Name ?? string.Empty);