From b323c0763f5ee31cb0f7c1a8fdc4e8e9604e8748 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Tue, 15 Sep 2026 15:18:17 +0200 Subject: [PATCH] Task.CompletedTask vs Task.FromResult vs return: retarget net10.0, drop redundant async, add notification handler example - Retarget both projects from net7.0 to net10.0 - Bump Microsoft.NET.Test.Sdk to 18.10.1, xunit to 2.9.3, xunit.runner.visualstudio to 4.0.0, coverlet.collector to 10.0.1 - UseTaskFromResultAsync() drops async/await and returns Task.FromResult(message) directly - Remove UseTaskCompletedSync() and UseTaskFromResultSync(), and their calls in Program.cs - Add INotificationHandler and ConsoleNotificationHandler, the imposed-signature case for Task.CompletedTask - Add two tests asserting both factory-returned tasks are already complete without being awaited --- .../ConsoleNotificationHandler.cs | 11 ++++++++++ .../INotificationHandler.cs | 6 ++++++ .../Program.cs | 2 -- .../TaskCompletedHandler.cs | 7 ------- ...tedVsTaskFromResultVsReturnInCSharp.csproj | 2 +- .../TaskFromResultHandler.cs | 13 ++---------- ...TaskFromResultVsReturnInCSharpTests.csproj | 10 +++++----- ...kCompletedVsTaskFromResultVsReturnTests.cs | 20 +++++++++++++++++++ 8 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/ConsoleNotificationHandler.cs create mode 100644 async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/INotificationHandler.cs diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/ConsoleNotificationHandler.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/ConsoleNotificationHandler.cs new file mode 100644 index 0000000000..944e7b7d91 --- /dev/null +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/ConsoleNotificationHandler.cs @@ -0,0 +1,11 @@ +namespace TaskCompletedVsTaskFromResultVsReturnInCSharp; + +public class ConsoleNotificationHandler : INotificationHandler +{ + public Task HandleAsync(string message) + { + Console.WriteLine(message); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/INotificationHandler.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/INotificationHandler.cs new file mode 100644 index 0000000000..1070ed11be --- /dev/null +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/INotificationHandler.cs @@ -0,0 +1,6 @@ +namespace TaskCompletedVsTaskFromResultVsReturnInCSharp; + +public interface INotificationHandler +{ + Task HandleAsync(string message); +} \ No newline at end of file diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/Program.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/Program.cs index cda0e1b40a..addc51b02f 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/Program.cs +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/Program.cs @@ -2,11 +2,9 @@ var taskCompletedClass = new TaskCompletedHandler(); await taskCompletedClass.UseTaskCompletedAsync(); -taskCompletedClass.UseTaskCompletedSync(); var taskFromResultClass = new TaskFromResultHandler(); await taskFromResultClass.UseTaskFromResultAsync(); -taskFromResultClass.UseTaskFromResultSync(); var returnClass = new ReturnHandler(); await returnClass.UseReturnAsync(); diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedHandler.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedHandler.cs index 6ae5d7b174..fc201adf45 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedHandler.cs +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedHandler.cs @@ -8,11 +8,4 @@ public Task UseTaskCompletedAsync() return Task.CompletedTask; } - - public void UseTaskCompletedSync() - { - Console.WriteLine("Performing a synchronous work."); - - Task.CompletedTask.Wait(); - } } \ No newline at end of file diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp.csproj b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp.csproj index f02677bf64..dfb40caafc 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp.csproj +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net10.0 enable enable diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskFromResultHandler.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskFromResultHandler.cs index 7929db35ba..012cb74f27 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskFromResultHandler.cs +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/TaskCompletedVsTaskFromResultVsReturnInCSharp/TaskFromResultHandler.cs @@ -2,21 +2,12 @@ public class TaskFromResultHandler { - public async Task UseTaskFromResultAsync() + public Task UseTaskFromResultAsync() { Console.WriteLine("Not performing any asynchronous work but returning a result."); var message = "Hello, world!"; - return await Task.FromResult(message); - } - - public string UseTaskFromResultSync() - { - Console.WriteLine("Performing a synchronous work."); - - var message = "Hello, world!"; - - return Task.FromResult(message).Result; + return Task.FromResult(message); } } \ No newline at end of file diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnInCSharpTests.csproj b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnInCSharpTests.csproj index c6f372580a..f6f7ed0ced 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnInCSharpTests.csproj +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnInCSharpTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -10,13 +10,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnTests.cs b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnTests.cs index ff4bdfc0dc..75a325be8c 100644 --- a/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnTests.cs +++ b/async-csharp/TaskCompletedTaskFromResultVsReturnInCSharp/Tests/TaskCompletedVsTaskFromResultVsReturnTests.cs @@ -31,4 +31,24 @@ public async Task WhenCallingUseReturnAsync_ThenUseReturn() Assert.Equal(20, result); } + + [Fact] + public void WhenCallingUseTaskFromResultAsync_ThenTaskIsAlreadyComplete() + { + var taskFromResultClass = new TaskFromResultHandler(); + + var result = taskFromResultClass.UseTaskFromResultAsync(); + + Assert.True(result.IsCompletedSuccessfully); + } + + [Fact] + public void WhenCallingHandleAsync_ThenTaskIsAlreadyComplete() + { + INotificationHandler handler = new ConsoleNotificationHandler(); + + var result = handler.HandleAsync("Order 42 shipped."); + + Assert.True(result.IsCompletedSuccessfully); + } } \ No newline at end of file