❔ Data doesnt get set with DispatcherQueue.TryEnqueue()
I try to get my camera feed with opencv on a non UI thread in WinUI 3. It's weird the data gets pushed into the queue, but the function doesn't get fired.
I start CaptureAsync with
Task.Run()
Task.Run()
because when I start it with
CaptureAsync().ConfigureAwait(false);
CaptureAsync().ConfigureAwait(false);
the UI gets blocked even with Task.Yield.
private async Task CaptureAsync(){ _cts.TryReset(); if (CurrentSource is null) return; DispatcherQueue? queue = DispatcherQueue.GetForCurrentThread(); try { _capture = VideoCapture.FromCamera(CurrentSource.Id); byte[] data; while (!_cts.IsCancellationRequested) { using Mat? image = _capture.RetrieveMat(); if (image.Height <= 0) continue; data = image.ToBytes(); queue?.TryEnqueue(() => SetData(data)); // data != null, checked await Task.Yield(); } } catch (Exception e) { Console.WriteLine(e); throw; }}// doesnt get fired onceprivate void SetData(byte[] data) => CurrentFrame = data;
private async Task CaptureAsync(){ _cts.TryReset(); if (CurrentSource is null) return; DispatcherQueue? queue = DispatcherQueue.GetForCurrentThread(); try { _capture = VideoCapture.FromCamera(CurrentSource.Id); byte[] data; while (!_cts.IsCancellationRequested) { using Mat? image = _capture.RetrieveMat(); if (image.Height <= 0) continue; data = image.ToBytes(); queue?.TryEnqueue(() => SetData(data)); // data != null, checked await Task.Yield(); } } catch (Exception e) { Console.WriteLine(e); throw; }}// doesnt get fired onceprivate void SetData(byte[] data) => CurrentFrame = data;
I do have two options. Fix the Task.Yield() problem or let it run on a secondary thread and fix the queue data. What would you do?