I thought that the canceled status of a task is set if (source):
The task acknowledged cancellation by throwing an
OperationCanceledExceptionwith its ownCancellationTokenwhile the token was in signaled state, or the task'sCancellationTokenwas already signaled before the task started executing.
But if you call ThrowIfCancellationRequested in the lambda in the task without initialization with token, then the status changes to canceled.
Is this a bug or please explain what's going on?
Tested on C# for .NET 5 on VS 2019 and .NET 6 on VS 2022.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(500);
void MyMethod()
{
while (true)
{
Thread.Sleep(100);
cancellationTokenSource.Token.ThrowIfCancellationRequested();
}
}
Task t1 = new Task(MyMethod);
t1.Start();
Task<int> t2 = new Task<int>(() => { MyMethod(); return 1; });
t2.Start();
Task t3 = Task.Factory.StartNew(MyMethod);
Task t4 = Task.CompletedTask.ContinueWith((t) => { MyMethod(); });
Task t5 = Task.Run(MyMethod);
Task t6 = Task.Run(() =>
{
while (true)
{
Thread.Sleep(100);
cancellationTokenSource.Token.ThrowIfCancellationRequested();
}
});
try
{
Task.WaitAll(t1, t2, t3, t4, t5, t6);
}
catch
{
}
Console.WriteLine($"Status t1 from new Task: {t1.Status}"); //Faulted
Console.WriteLine($"Status t2 from new Task<: {t2.Status}"); //Faulted
Console.WriteLine($"Status t3 from Task.Factory.StartNew: {t3.Status}"); //Faulted
Console.WriteLine($"Status t4 from Task.CompletedTask.ContinueWith: {t4.Status}"); //Faulted
Console.WriteLine("\n");
Console.WriteLine($"Status t5 from Task.Run: {t5.Status}"); //Faulted
Console.WriteLine($"Status t6 from Task.Run with lambda: {t6.Status}"); //Canceled
}
}
}
Faulted instead of Canceled.
Output:
Status t1 from new Task: Faulted
Status t2 from new Task<int>: Faulted
Status t3 from Task.Factory.StartNew: Faulted
Status t4 from Task.CompletedTask.ContinueWith: Faulted
Status t5 from Task.Run: Faulted
Status t6 from Task.Run with lambda: Canceled