From 919c6ef526e39c6fcaf28c4073c8cfcbeeed4eff Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Mon, 27 Oct 2025 19:38:58 +0100 Subject: [PATCH 1/2] Use CreateLinkedTokenSource to bind to TestContext cancellationtoken --- FFMpegCore.Test/VideoTest.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/FFMpegCore.Test/VideoTest.cs b/FFMpegCore.Test/VideoTest.cs index accba60..e338324 100644 --- a/FFMpegCore.Test/VideoTest.cs +++ b/FFMpegCore.Test/VideoTest.cs @@ -1050,7 +1050,7 @@ public class VideoTest { using var outputFile = new TemporaryFile("out.mp4"); - var cts = new CancellationTokenSource(); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); var task = FFMpegArguments .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args @@ -1061,7 +1061,6 @@ public class VideoTest .WithVideoCodec(VideoCodec.LibX264) .WithSpeedPreset(Speed.VeryFast)) .CancellableThrough(cts.Token) - .CancellableThrough(TestContext.CancellationToken) .ProcessAsynchronously(false); cts.CancelAfter(300); @@ -1077,7 +1076,7 @@ public class VideoTest { using var outputFile = new TemporaryFile("out.mp4"); - var cts = new CancellationTokenSource(); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); var task = FFMpegArguments .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args @@ -1088,7 +1087,6 @@ public class VideoTest .WithVideoCodec(VideoCodec.LibX264) .WithSpeedPreset(Speed.VeryFast)) .CancellableThrough(cts.Token) - .CancellableThrough(TestContext.CancellationToken) .ProcessAsynchronously(); cts.CancelAfter(300); @@ -1102,7 +1100,7 @@ public class VideoTest { using var outputFile = new TemporaryFile("out.mp4"); - var cts = new CancellationTokenSource(); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); var task = FFMpegArguments .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args @@ -1126,7 +1124,7 @@ public class VideoTest { using var outputFile = new TemporaryFile("out.mp4"); - var cts = new CancellationTokenSource(); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); cts.Cancel(); var task = FFMpegArguments @@ -1149,7 +1147,7 @@ public class VideoTest { using var outputFile = new TemporaryFile("out.mp4"); - var cts = new CancellationTokenSource(); + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); var task = FFMpegArguments .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args From 3c8d2c23c1f923c255ddd378f7cfa2c5b92f0663 Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Mon, 27 Oct 2025 19:39:13 +0100 Subject: [PATCH 2/2] Use using for CancellationTokenSource --- FFMpegCore.Test/FFProbeTests.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/FFMpegCore.Test/FFProbeTests.cs b/FFMpegCore.Test/FFProbeTests.cs index ee837bf..2ee5a92 100644 --- a/FFMpegCore.Test/FFProbeTests.cs +++ b/FFMpegCore.Test/FFProbeTests.cs @@ -1,4 +1,5 @@ using FFMpegCore.Exceptions; +using FFMpegCore.Helpers; using FFMpegCore.Test.Resources; namespace FFMpegCore.Test; @@ -292,7 +293,7 @@ public class FFProbeTests public async Task Parallel_FFProbe_Cancellation_Should_Throw_Only_OperationCanceledException() { // Warm up FFMpegCore environment - Helpers.FFProbeHelper.VerifyFFProbeExists(GlobalFFOptions.Current); + FFProbeHelper.VerifyFFProbeExists(GlobalFFOptions.Current); var mp4 = TestResources.Mp4Video; if (!File.Exists(mp4)) @@ -301,28 +302,26 @@ public class FFProbeTests return; } - var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); - var token = cts.Token; + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); using var semaphore = new SemaphoreSlim(Environment.ProcessorCount, Environment.ProcessorCount); var tasks = Enumerable.Range(0, 50).Select(x => Task.Run(async () => { - await semaphore.WaitAsync(token); + await semaphore.WaitAsync(cts.Token); try { - var analysis = await FFProbe.AnalyseAsync(mp4, cancellationToken: token); + var analysis = await FFProbe.AnalyseAsync(mp4, cancellationToken: cts.Token); return analysis; } finally { semaphore.Release(); } - }, token)).ToList(); + }, cts.Token)).ToList(); // Wait for 2 tasks to finish, then cancel all await Task.WhenAny(tasks); await Task.WhenAny(tasks); await cts.CancelAsync(); - cts.Dispose(); var exceptions = new List(); foreach (var task in tasks)